Ich bin neugierig auf eine Aussage von Ссылка , nämlich beschreibt
%Vor%als effizientes Dot-Produkt. Mein Verständnis ist, dass IMAP einen Generator statt einer Liste gibt, und während ich verstehe, wie es schneller wäre / weniger Speicher verbrauchen, wenn Sie nur die ersten paar Elemente mit der umgebenden Summe () betrachten, sehe ich nicht wie Es verhält sich anders als:
%Vor% Der Unterschied zwischen map
und imap
wird deutlich, wenn Sie beginnen, die Größe dessen, über das Sie iterieren, zu erhöhen:
Beachten Sie, dass sich das integrierte map
in Python 3 verhält wie das itertools.imap
von Python 2 (das entfernt wurde, weil es nicht mehr benötigt wird). Um das Verhalten "alt map
" zu erhalten, verwenden Sie list(map(...))
. Dies ist ein weiterer guter Weg, um sich vorzustellen, wie sich Pythons 2 itertools.imap
und map
voneinander unterscheiden.
Eine andere Sache, die zu beachten ist, ist, dass "viel weniger Speicher verbraucht" oft bedeutet "läuft auch schneller". Die Lazy (Iterator) -Version konsumiert jedes Produkt, sobald es berechnet wird, und addiert es in die laufende Summe. Das Produkt und die laufende Summe befinden sich beide fast sicher im L1-Cache. Wenn Sie zuerst alle Produkte berechnen, dann ist es abhängig von der Anzahl der Elemente sicher, dass die ersten berechneten Produkte aus dem L1-Cache und dann aus dem L2-Cache herausgeschleudert werden, und ..., wenn ein zweiter Durchlauf durchgeführt wird Schließlich fügen sie alle zusammen, alle Produkte sind in der Speicherhierarchie niedrig (und im Extremfall müssen sie aus einer Auslagerungsdatei gelesen werden).
Aber es ist mir unklar, was du unter "sehe nicht, wie es sich anders verhält" verstehen. Das endgültige berechnete Ergebnis ist in beiden Fällen gleich.
Der Unterschied besteht darin, dass die gesamte Ausgabe von imap(...)
oder map(...)
an sum()
übergeben wird. Sie schreiben, dass imap
einen Generator zurückgibt, aber ich denke, Sie haben vielleicht den Eindruck, dass sum(map(...))
eine Verknüpfung hat, die dasselbe tut. Es tut es nicht. map()
erstellt eine vollständige Liste der Ergebnisse bevor alles an sum()
übergeben wird.
Tags und Links python itertools python-2.x