Simulación

Medición de desempeño computacional en Python

Para estudiar qué tan eficiente es algún código, conviene saber evaluar cuánta memoria RAM requiere y cuánto tarda su ejecución.

Tiempo de ejecución

>>> n = 2**15
>>> import numpy as np
>>> from time import time
>>> before, M, after = time(), np.random.rand(n, n), time()
>>> after - before
11.19525694847107
>>> from timeit import timeit
>>> def prueba():
...     return np.min(M)
...
>>> timeit('prueba()', 'from __main__ import prueba', number = 3)
1.4250516089998655

Memoria utilizada

La librería sys contiene una rutina que mide el tamaño de un objeto.

>>> n = 2**15
>>> from sys import getsizeof
>>> import numpy as np
>>> M = np.random.rand(n, n)
>>> getsizeof(M) # bytes
8589934704
>>> getsizeof(M) / 1024 # kilobytes
8388608.109375
>>> getsizeof(M) # megabytes
8192.000106811523
>>> getsizeof(M) # gigabytes
8.000000104308128

Sin embargo, si ese objeto refiere a subobjetos, su tamaño no se toma en cuenta, pero para esos casos ya existe un script útil.

>>> n = 2**15
>>> from sys import getsizeof
>>> import numpy as np
>>> M = np.random.rand(n, n)
>>> a = [1, M, 'hola']
>>> getsizeof(a)
88
>>> get_size(a) # usando el script de arriba
8589935129

Una vez que un objeto pesado ya no se requiere, se puede marcar para una eliminación futura con del operaciones futuras. No hay forma para forzar la liberación de memoria que ya cuenta con referencias desde variables existentes, pero técnicamente se puede solicitar la ejecución del recolector de basura con gc.collect() de la librería gc.

Actualizado el 16 de noviembre del 2022.
https://satuelisa.github.io/simulation/medicion/Python.html