Tim Peters répondu pourquoi c'est lent, mais nous allons voir comment améliorer cela.
Tenir à votre exemple de l' sum(range(...))
(facteur 10 plus petite que votre exemple pour tenir en mémoire ici):
import numpy
import array
L = list(range(10**7))
A = array.array('l', L)
N = numpy.array(L)
%timeit sum(L)
10 loops, best of 3: 101 ms per loop
%timeit sum(A)
1 loop, best of 3: 237 ms per loop
%timeit sum(N)
1 loop, best of 3: 743 ms per loop
De cette façon, aussi numpy besoins de boîte/unbox, qui a la charge supplémentaire. Pour faire vite, on doit rester à l'intérieur de la numpy code c:
%timeit N.sum()
100 loops, best of 3: 6.27 ms per loop
Donc, à partir de la liste de la solution à la numpy version, c'est un facteur 16 en runtime.
Nous allons également vérifier combien de temps la création de ces structures de données prend
%timeit list(range(10**7))
1 loop, best of 3: 283 ms per loop
%timeit array.array('l', range(10**7))
1 loop, best of 3: 884 ms per loop
%timeit numpy.array(range(10**7))
1 loop, best of 3: 1.49 s per loop
%timeit numpy.arange(10**7)
10 loops, best of 3: 21.7 ms per loop
Gagnant clair: Numpy
Notez également que la création de la structure de données prend environ autant de temps que la sommation, si pas plus. L'allocation de mémoire est lente.
L'utilisation de la mémoire de ceux:
sys.getsizeof(L)
90000112
sys.getsizeof(A)
81940352
sys.getsizeof(N)
80000096
Donc ces 8 octets par nombre avec divers frais généraux. Pour la gamme que nous utilisons 32bit ints sont suffisantes, nous avons donc pour la sécurité de la mémoire.
N=numpy.arange(10**7, dtype=numpy.int32)
sys.getsizeof(N)
40000096
%timeit N.sum()
100 loops, best of 3: 8.35 ms per loop
Mais il s'avère que l'ajout de 64 bits ints est plus rapide que les entiers 32 bits sur ma machine, donc c'est seulement utile si vous êtes limité par la mémoire/de la bande passante.