itertools.imap vs. map über das gesamte iterable

8

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%     
Joe 31.12.2013, 16:20
quelle

4 Antworten

14

Der Unterschied zwischen map und imap wird deutlich, wenn Sie beginnen, die Größe dessen, über das Sie iterieren, zu erhöhen:

%Vor%

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.

    
Max Noel 31.12.2013 16:29
quelle
7

Die erste Zeile berechnet die kumulative Summe der Summe einzeln. Die zweite berechnet zunächst das gesamte Skalarprodukt, und danach wird das gesamte Ergebnis im Speicher gespeichert, um die Summe zu berechnen. Es gibt also einen Speicherkomplexitätsgewinn.

    
BartoszKP 31.12.2013 16:22
quelle
2

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.

    
Tim Peters 01.01.2014 01:01
quelle
2

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.

    
Kirk Strauser 01.01.2014 01:41
quelle

Tags und Links