Advertisement
JPablos

Generador. Python

Apr 14th, 2021
647
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.54 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. """
  3. Para aprender un poco más sobre el uso de 'Generadores' en Python, encontré
  4. este excelente video creado por 'Corey Schafer'
  5.  
  6.    < https://www.youtube.com/watch?v=bD05uGo_sVI >
  7.    
  8.    "Tutorial de Python: Generadores - Como usarlos y los beneficios
  9.    que obtienes"
  10.  
  11. El código esta escrito para 'python2.X', así que buscando, encontré el
  12. código original en:
  13.  
  14. https://github.com/CoreyMSchafer/code_snippets/blob/master/Generators/people.py
  15.  
  16. y, basado en las respuestas a esta pregunta:
  17.  
  18. https://stackoverflow.com/questions/41191412/no-module-named-mem-profile
  19.  
  20. Hice las siguientes modificaciones para ejecutar el código en 'Python 3.8'
  21.         =========================
  22.  
  23.    1.  Instalar el módulo < memory_profiler >
  24.  
  25.        $ pip3 install memory_profiler
  26.        ...
  27.        $ sudo updatedb
  28.        ...
  29.  
  30.    2.  Cambios en el còdigo
  31.        *   agregar '( )' a los print
  32.        *   usar 'mem_profile.memory_usage()' en los print
  33.        *   usar 'range' en lugar de 'xrange' en el bucle 'for'
  34.        *   usar 'time.time()' para medir los tiempos 't1' y 't2'
  35.        Con el módulo  < memory_profiler >, instalado:
  36.        *   'import memory_profiler as mem_profile'
  37.  
  38. Hechos los cambios, el código funciona en 'Python 3.8'
  39.  
  40. El primer método, 'listando el generador', tiene un gran impacto en
  41. la memoria, utiliza unos [270.8828125]Mb para almacenar el objeto
  42. 'lista' solicitado.
  43.  
  44. Si miramos los tiempos, emplea [0.9230213165283203]segs más que el
  45. segundo método 'solo con el generador', el impacto del segundo método
  46. en la memoria, es prácticamente nulo.
  47.  
  48. Los datos aquí expuestos pueden variar dependiendo de las características
  49. de máquina y la arquitectura (32bits / 64 bits) de la misma, en que se
  50. ejecute el código
  51.  
  52. En los dos casos, se prueba para un rango de 1 millón de datos.
  53.  
  54. Con el código 'adaptado', vamos al análisis
  55.  
  56. """
  57.  
  58. import memory_profiler as mem_profile
  59. import random
  60. import time
  61.  
  62. names = ['John', 'Corey', 'Adam', 'Steve', 'Rick', 'Thomas']
  63. majors = ['Math', 'Engineering', 'CompSci', 'Arts', 'Business']
  64.  
  65. print('Memory (Before): {}Mb'.format(mem_profile.memory_usage()))
  66.  
  67. def people_list(num_people):
  68.     result = []
  69.     for i in range(num_people):
  70.         person = {
  71.                     'id': i,
  72.                     'name': random.choice(names),
  73.                     'major': random.choice(majors)
  74.                 }
  75.         result.append(person)
  76.     return result
  77.  
  78. def people_generator(num_people):
  79.     for i in range(num_people):
  80.         person = {
  81.                     'id': i,
  82.                     'name': random.choice(names),
  83.                     'major': random.choice(majors)
  84.                 }
  85.         yield person
  86.  
  87.  
  88. # Elimine los '#' para ejecutar este código, 'listando el generador'
  89.  
  90. # t1 = time.time()
  91. # people = people_list(1000000)
  92. # t2 = time.time()
  93.  
  94. """
  95. Resultado listando el generador
  96. =================================
  97.  
  98. Memory (Before): [43.78125]Mb
  99. Memory (After) : [314.6640625]Mb
  100. Took 0.9230234622955322 Seconds
  101. =================================
  102. """
  103.  
  104. # Elimine los '#' para ejecutar este código, 'solo con el generador'
  105.  
  106. # t1 = time.time()
  107. # people = people_generator(1000000)
  108. # t2 = time.time()
  109.  
  110. """
  111. Resultado solo con el generador
  112. =================================
  113.  
  114. Memory (Before): [43.75]Mb
  115. Memory (After) : [43.75]Mb
  116. Took 2.1457672119140625e-06 Seconds
  117. =================================
  118. """
  119.  
  120. print('Memory (After) : {}Mb'.format(mem_profile.memory_usage()))
  121. print('Took {} Seconds'.format(t2 - t1))
  122.  
  123.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement