Ist pythonautomatisch parallelisierende IO- und CPU- oder speichergebundene Abschnitte?

Dies ist ein Folge-Fragen zu einem früheren .

Betrachten Sie diesen Code, der weniger spielerisch ist als der in der vorherigen Frage (aber immer noch viel einfacher als meine echte)

import sys data=[] for line in open(sys.argv[1]): data.append(line[-1]) print data[-1] 

Nun erwarte ich eine längere Laufzeit (meine Benchmark-Datei ist 65150224 Zeilen lang), vielleicht viel länger. Dies war nicht der Fall, es läuft in ~ 2 Minuten auf dem gleichen hw wie vorher!

Ist es data.append () sehr leicht? Ich glaube nicht so, also habe ich diesen gefälschten Code geschrieben, um ihn zu testen:

 data=[] counter=0 string="a\n" for counter in xrange(65150224): data.append(string[-1]) print data[-1] 

Dies läuft in 1,5 bis 3 Minuten (es gibt starke Variabilität unter Läufen)

Warum bekomme ich nicht 3.5 bis 5 Minuten im ehemaligen Programm? Offensichtlich ist data.append () parallel zum IO geschehen.

Das sind gute Neuigkeiten!

Aber wie funktioniert es? Ist es ein dokumentiertes Feature? Gibt es eine Anforderung an meinen Code, dass ich folgen sollte, damit es so viel wie möglich funktioniert (neben Load-Balancing IO und Speicher / CPU-Aktivitäten)? Oder ist es einfach nur Pufferung / Caching in Aktion?

Wieder habe ich diese Frage "linux" getroffen, weil ich mich nur für linux-spezifische Antworten interessiere. Fühlen Sie sich frei, OS-Agnostiker oder sogar andere OS-Antworten zu geben, wenn Sie denken, dass es sich lohnt zu tun.

5 Solutions collect form web for “Ist pythonautomatisch parallelisierende IO- und CPU- oder speichergebundene Abschnitte?”

Offensichtlich ist data.append () parallel zum IO geschehen.

Ich fürchte nein. Es ist möglich, IO und die Berechnung in Python zu parametrieren, aber es kommt nicht magisch vor.

Eine Sache, die Sie tun können, ist, posix_fadvise(2) zu verwenden, um dem OS einen Hinweis zu geben, dass Sie planen, die Datei sequentiell zu lesen ( POSIX_FADV_SEQUENTIAL ).

In einigen groben Tests, die "wc -l" auf einer 600-Meg-Datei (ISO) durchführen, erhöhte sich die Leistung um etwa 20%. Jeder Test wurde sofort nach dem Löschen des Plattencaches durchgeführt.

Für eine Python-Schnittstelle zu fadvise siehe python-fadvise .

Wie groß sind die Zeilen in deiner Datei? Wenn sie nicht sehr lang sind (alles unter etwa 1K vermutlich qualifiziert), dann sehen Sie wahrscheinlich Leistungsgewinne wegen der Eingabepufferung.

Warum glaubst du, list.append () wäre eine langsamere Operation? Es ist extrem schnell, wenn man bedenkt, dass die internen Zeiger-Arrays, die von Listen verwendet werden, um Verweise auf die Objekte in ihnen zuzuordnen, in immer größeren Blöcken zugewiesen werden, so dass jeder Append das Array nicht wirklich neu zuordnen kann und die meisten einfach den Längenzähler erhöhen können Setzen Sie einen Zeiger und erhöhen Sie sich.

Ich sehe keine Beweise dafür, dass "data.append () parallel zum IO geschieht." Wie Benji, ich glaube nicht, dass dies automatisch in der Art, wie Sie denken. Sie haben gezeigt, dass das Verwenden von data.append (Linie [-1]) etwa die gleiche Zeitspanne wie lc = lc + 1 (im Wesentlichen keine Zeit im Vergleich zu der IO- und Linienspaltung) annimmt. Es ist nicht wirklich überraschend, dass data.append (line [-1]) sehr schnell ist. Man würde erwarten, dass die ganze Linie in einem schnellen Cache ist, und wie angemerkt append bereitet Puffer vor der Zeit und nur selten muss neu zuordnen. Außerdem wird die Zeile [-1] immer '\ n' sein, außer vielleicht für die letzte Zeile der Datei (keine Ahnung, ob Python dafür optimiert).

Der einzige Teil, den ich ein wenig überrascht bin, ist, dass das Xrange so variabel ist. Ich würde erwarten, dass es immer schneller ist, da gibt es kein IO, und du bist eigentlich nicht mit der Theke.

Wenn Ihre Laufzeiten von diesem Betrag für das zweite Beispiel variieren, würde ich vermuten, dass Ihre Methode des Timings oder der äußeren Einflüsse (andere Prozesse / Systembelastung) die Zeiten bis zu dem Punkt, wo sie keine zuverlässigen Informationen geben, schief werden.

  • Kopieren von einer Textdatei in eine andere mit Python
  • Bestimmen Sie die Verschlüsselung von Text in Python
  • Öffnen von Textdateien aus einer Liste in einer anderen Textdatei mit python
  • Wie spalte ich eine riesige Textdatei in Python
  • Bearbeiten einer einzelnen Zeile in einer großen Textdatei
  • Python: Laden von Wörtern aus Datei in einen Satz
  • Suchen von Textdateien mit verschiedenen Codierungen mit Python?
  • Ist es möglich, python IO zu beschleunigen?
  • So lesen und organisieren Sie Textdateien geteilt durch Schlüsselwörter
  • Python Write to Text File Dictionary Zeigt falsche Informationen an
  • Txt-Datei mit Multi-Threaded in Python lesen
  • Python ist die beste Programmiersprache der Welt.