Y at-il un avantage à utiliser numpy lorsque vous effectuez un grand nombre d'opérations sur des listes de valeurs binaires? Que diriez-vous des entiers dans une petite gamme (comme seulement les nombres 1,2 et 3?)Utiliseriez-vous numpy si vous étiez en train de manipuler une séquence de valeurs binaires?
3
A
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
J'ai trouvé BitArray être de type parfois lent. –
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? –