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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 ...