Per valutare la velocità di esecuzione, utilizzeremo la libreria timeit.
import timeit
import numpy as np
setup = """
import numpy as np
tmp = np.empty(shape=(1, 100))
values = [i for i in xrange(100)]
"""
stmt1 = """tmp[0, :] = values"""
stmt2 = """
for i, val in enumerate(values):
tmp[0, i] = val
"""
time1 = timeit.Timer(setup=setup, stmt=stmt1)
time2 = timeit.Timer(setup=setup, stmt=stmt2)
print "numpy way :", time1.timeit(number=100000)
print "Python way:", time2.timeit(number=100000)
È possibile verificare questo e si noterà che i cicli NumPy sono due volte più veloce:
- numpy way : 0.97758197784423828
- Python way: 2.1633858680725098
Questo perché v'è una fase in cui i numeri interi in values
(che sono interi illimitati) sono convertiti in float di 64 bit. Al fine di confrontare solo la velocità del loop, la conversione di tipo può essere fatta preliminarmente nel setup:
values = np.array([i for i in xrange(100)], dtype=np.float64)
Ecco cosa ho ottenuto:
numpy way : 0.131125926971
Python way: 2.64055013657
notiamo che i cicli NumPy sono 20 volte più veloce dei loop Python.
Troverete ulteriori informazioni se cercate vectorized computations in Python ...
'numpy' è open source, se siete interessati a come qualcosa * * implementato basta guardare le fonti. – Bakuriu
La risposta è "dipende". Cerca in 'core/src/multiarray/sequence.c' nella distribuzione di Numpy (' array_assign_slice': https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/sequence.c#L91). Nel tuo esempio, penso che il codice non convertirà la lista in una matrice, ma a seconda degli altri casi, potrebbe. –
@goncalopp sì, sono preoccupato per l'utilizzo della memoria. – methane