diesen Leistungstest Betrachten auf IPython unter Python 3:numpy.sum auf Reichweite und range_iterator Objekte
einen Bereich erstellen einen range_iterator und einen Generator
In [1]: g1 = range(1000000)
In [2]: g2 = iter(range(1000000))
In [3]: g3 = (i for i in range(1000000))
Measure Zeit für native Summe mit Python Summieren
In [4]: %timeit sum(g1)
10 loops, best of 3: 47.4 ms per loop
In [5]: %timeit sum(g2)
The slowest run took 374430.34 times longer than the fastest. This could mean that an intermediate result is being cached.
10000000 loops, best of 3: 123 ns per loop
In [6]: %timeit sum(g3)
The slowest run took 1302907.54 times longer than the fastest. This could mean that an intermediate result is being cached.
10000000 loops, best of 3: 128 ns per loop
Nicht sicher, ob ich über die Warnung sorgen sollte. Das Timing der Bereichsversion ist unterschiedlich lang (warum?), Aber der Range_iterator und der Generator sind ähnlich.
Jetzt ist numpy.sum
In [7]: import numpy as np
In [8]: %timeit np.sum(g1)
10 loops, best of 3: 174 ms per loop
In [9]: %timeit np.sum(g2)
The slowest run took 8.47 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 6.51 µs per loop
In [10]: %timeit np.sum(g3)
The slowest run took 9.59 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 446 ns per loop
g1 und g3 wurde x ~ 3.5 langsamer, aber die range_iterator g2 ist jetzt einige ~ 50-mal langsamer im Vergleich zur nativen Summe verwenden lassen. g3 gewinnt.
In [11]: type(g1)
Out[11]: range
In [12]: type(g2)
Out[12]: range_iterator
In [13]: type(g3)
Out[13]: generator
Warum eine solche Strafe auf range_iterator auf numpy.sum? Sollten solche Objekte vermieden werden? Verallgemeinert - Generieren "hausgemachte" Generatoren immer andere Objekte auf numpigen?
EDIT 1: Ich erkannte, dass die np.sum den range_iterator nicht auswertet, sondern ein anderes range_iterator Objekt zurückgibt. Dieser Vergleich ist also nicht gut. Warum wird es nicht ausgewertet?
BEARBEITEN 2: Ich erkannte auch, dass numpy.sum den Bereich in ganzzahliger Form hält und dementsprechend die falschen Ergebnisse zu meiner Summe aufgrund Integerüberlauf gibt.
In [12]: sum(range(1000000))
Out[12]: 499999500000
In [13]: np.sum(range(1000000))
Out[13]: 1783293664
In [14]: np.sum(range(1000000), dtype=float)
Out[14]: 499999500000.0
Zwischenfazit - nicht numpy.sum auf nicht numpy Objekte verwenden ...?
Dies wiederholt eine vorherige ähnliche Frage, die off-topic markiert wurde. Hoffentlich finden Sie dieses zum Thema. – Aguy
Mögliches Duplikat von [Warum sind Pythons Arrays langsam?] (Http://stackoverflow.com/questions/36778568/why-are-pythons-arrays-slow) – styvane
@SSDMS - diese Antwort ist für 'import array', nicht' import numpy'. – hpaulj