2010-02-20 13 views

Répondre

3

L'élimination des boucles est la source du gain de performance (10x):

import profile 
import numpy as NP 

def np_test(a2darray) : 
    row_sums = NP.sum(a2darray, axis=1) 
    return NP.sum(row_sums) 

def stdlib_test2(a2dlist) : 
    return sum([sum(row) for row in a2dlist]) 

A = NP.random.randint(1, 6, 1e7).reshape(1e4, 1e3) 
B = NP.ndarray.tolist(A) 

profile.run("np_test(A)") 
profile.run("stdlib_test2(B)") 

numpy:

  • 10 appels de fonction dans 0.025 CPU secondes

listes:

  • 10005 appels de fonction dans 0,280 CPU secondes
1

Si le nombre de valeurs d'entrée est énorme, ou si vous faites beaucoup d'opérations, vous pouvez essayer bitarray. Ou, voir le bool/int8/uint8 DTYPE dans ndarray de Numpy:

In [1]: import numpy as np 
In [2]: data = np.array([0,1,1,0], dtype=bool) 
In [3]: data 
Out[3]: array([False, True, True, False], dtype=bool) 
In [4]: data.size 
Out[4]: 4 
In [5]: data.nbytes 
Out[5]: 4 
+0

J'ai trouvé BitArray être de type parfois lent. –

+0

Il pourrait être - j'ai seulement entendu et lu à ce sujet, mais à partir de la description, il semble que ce devrait être rapide. Est-il plus lent que les listes Python? –