Benchmark conversion list-->numpy.array
Bonjour à tous
Je cherche différent moyen de caster une liste (ou une portion de liste) en un numpy array. J'aurais besoin de plusieurs méthodes différentes selon les besoins/la situation alors je me disais pourquoi pas faire une classe qui dériverait de list et qui ajouterais à ce type les différentes méthodes de cast vers un array que je souhaites proposer.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import numpy as np
from time import time
datasize=10000
rd = np.random.RandomState(seed=0)
data = list( rd.rand(datasize) )
#### Option 1 : Une fonction exterieur
def to_nparray(datalist):
return np.array(datalist)
#### Option 2 : On creer une classe qui derive de list
class MyList(list):
def to_nparray(self):
return np.array(self)
data2 = MyList(data)
Niter4access = int(1e7)
Niter4nparr_cast= int(1e4)
t0 = time()
for i in range(Niter4access) : b=data[i%datasize]
t1 = time()
for i in range(Niter4access) : b=data2[i%datasize]
t2 = time()
for i in range(Niter4nparr_cast) : b=to_nparray(data)
t3 = time()
for i in range(Niter4nparr_cast) : b=data2.to_nparray()
t4 = time()
print("======== Exec time ========")
print("-- Particular acces (%s iter) ---"%Niter4access)
print("External fct: %s"%(t1-t0))
print("Class method: %s"%(t2-t1))
print("-- np.array cast (%s iter) ---"%Niter4nparr_cast)
print("External fct: %s"%(t3-t2))
print("Class method: %s"%(t4-t3)) |
A ma grande stupeur faire une nouvelle classe est donc bien plus couteux !
Code:
1 2 3 4 5 6 7
| ======== Exec time ========
-- Particular acces (10000000 iter) ---
External fct: 1.5281527042388916
Class method: 2.4622461795806885
-- np.array cast (10000 iter) ---
External fct: 5.599560022354126
Class method: 6.787678480148315 |
Quelqu'un peut-il tester chez lui et me dire s'il a les mêmes différences entre les 2 cas ? Qqn a-t-il une explication de pourquoi y a t il autant de différence sur le temps d'éxécution (+60% en coût sur l'accès particulaire tout de même ce n'est pas rien, et +27% sur la conversion ). Je sais qu'on rajoute une classe, donc c'est plus lourd. Mais à ce point ...