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.
>>> 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
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
.
https://satuelisa.github.io/simulation/medicion/Python.html