Ich lerne einfach nur numpy kennen, und ich bin beeindruckt von seinen Ansprüchen auf C-ähnliche Effizienz mit Speicherzugriff in seinen ndarrays. Ich wollte die Unterschiede zwischen diesen und pythonischen Listen für mich selbst sehen, also führte ich einen schnellen Timing-Test durch, indem ich ein paar der gleichen einfachen Aufgaben ohne Numpy ausführte. Numpy deklassierte reguläre Listen um eine Größenordnung bei der Zuweisung von und arithmetischen Operationen an Arrays, wie erwartet. Aber dieses Code-Segment, das in beiden Tests identisch war, benötigte ungefähr 1/8 Sekunde mit einer regulären Liste und etwas über 2,5 Sekunden mit numpy:
%Vor%Weiß jemand, warum das so sein könnte, und wenn es eine andere Syntax gibt, die ich für Operationen wie diese verwenden sollte, um besser auszunutzen, was der NDarray tun kann?
Danke ...
BEARBEITEN: Um Waynes Kommentar zu beantworten ... Ich habe sie beide wiederholt und in verschiedenen Reihenfolgen gemessen und jedes Mal ziemlich identische Ergebnisse erzielt, also bezweifle ich, dass es ein anderer Prozess ist. Ich stelle
file = open('timing.log','w')
for num in a2:
if num % 1000 == 0:
file.write("Multiple of 1000!\r\n")
file.close()
am Anfang der Datei nach dem numpy Import und dann habe ich Aussagen wie start = time()
durch.
a2
ist ein NumPy-Array, oder? Ein möglicher Grund, warum es in NumPy so lange dauern könnte (wenn die Aktivität anderer Prozesse dies nicht berücksichtigt, wie Wayne Werner vorgeschlagen hat), ist, dass Sie das Array mit einer Python-Schleife durchlaufen. Bei jedem Schritt der Iteration muss Python einen einzelnen Wert aus dem NumPy-Array abrufen und in eine Python-Ganzzahl konvertieren, was keine besonders schnelle Operation ist.
NumPy funktioniert viel besser, wenn Sie Operationen auf dem gesamten Array als eine Einheit ausführen können. In Ihrem Fall wäre eine Option (vielleicht nicht einmal die schnellste)
%Vor%Vergleiche das mit dem reinen Python-Äquivalent,
%Vor%oder
%Vor%Ich bin nicht überrascht, dass NumPy bei der Verwendung Ihres Snippets schlecht mit Python-Einbauten fertig wird. Ein großer Teil des Leistungsvorteils in NumPy entsteht dadurch, dass die Schleifen vermieden werden und stattdessen auf das Array durch Indizierung zugegriffen wird:
In NumPy ist es häufiger so:
%Vor%Tags und Links python performance numpy