Dateiverarbeitungsgeschwindigkeit von Python 3.3 im Vergleich zu Fortran 77

9

Seltsame Frage, das weiß ich.

Ich habe eine Codebasis in Fortran 77, die größtenteils große nicht-binäre Dateien analysiert, einige Manipulationen an diesen Dateien vornimmt und dann eine Menge Dateien schreibt. Die Codebasis führt keine Matrixmanipulation oder Zahlenverarbeitung durch. Dieser Legacy-Code ist in Fortran, weil viele andere Codebasen eine ernsthafte Zahlenverarbeitung erfordern. Dies war ursprünglich nur in Fortran geschrieben, weil es Fortran kannte.

Mein Vorschlag ist, dies vollständig in Python zu schreiben (wahrscheinlich 3.3). Die Wartung des Fortran-Codes ist genauso schwierig, wie Sie es erwarten würden, und die Tests sind so schlecht, wie Sie sich vorstellen können. Offensichtlich würde Python hier sehr helfen.

Gibt es Performance-Hits (oder sogar Gewinne) in Bezug auf die Dateiverarbeitungsgeschwindigkeit in Python? Zur Zeit läuft das Lesen / Schreiben der Dateien hauptsächlich in der Laufzeit des Systems.

Vielen Dank im Voraus

    
Fraser 04.10.2013, 13:59
quelle

2 Antworten

3

Die IO-Teile der Python-Standardbibliothek sind als effizienter C-Code implementiert, so dass ich eine Leistung gesehen habe, die besser ist als z.B. Java, insbesondere in Fällen, in denen das Programm IO-gebunden ist (im Gegensatz zur CPU-Bindung).

Re:

  

Momentan läuft die meiste Laufzeit dieses Systems im Lesen / Schreiben der Dateien.

Wenn Ihre Logik die Datei als Stream verarbeitet und nicht den gesamten Inhalt der Datei, können Sie sogar eine Leistungsverbesserung bei der Migration zu Python feststellen, wenn Sie die richtigen Tools für den Job verwenden. Grundsätzlich besteht die Idee darin, die Eingabe in Chunks zu lesen, den Chunk zu verarbeiten und das Ergebnis sofort in die Ausgabedatei zu schreiben. Dies minimiert die Speicherauslastung und die Latenz, insbesondere wenn Ihre Pipeline aus mehreren Schritten besteht. Python-Generatoren ermöglichen das Schreiben einer solchen Logik in einer sehr sauberen, lesbaren und prägnanten Art und Weise, die Sie in Fortran oder C nicht finden werden, zumindest ohne einen großen zusätzlichen Aufwand, um eine solche Abstraktion zu erstellen (und selbst dann würden Sie enden) sehr magischer und / oder kryptischer Code).

Siehe Ссылка für einen wirklich guten Text über die Dateiverarbeitung in Python mit Generatoren.

Je nach Art und Komplexität Ihrer Verarbeitungsalgorithmen finden Sie möglicherweise auch andere Abstraktionen (z. B. Korotinen ) oder Bibliotheken ( gevent , numpy usw.), die in Python verfügbar sind, werden Ihnen helfen, eine bessere Gesamtperformance zu erzielen, da es einfacher ist, den Code zu verstehen und zu refaktorieren. (Dies gilt natürlich für jeden Vergleich zwischen High-Level und Low-Level-Sprachen.)

Sieh dir auch PyPy an: Es könnte eine (manchmal signifikante) Leistung bieten Boost über CPython in der Anzahl Crunching Teil ohne zusätzlichen Aufwand auf Ihrer Seite (um nicht zu sagen, dass Sie nicht Ihren Code für den PyPy JIT-Compiler optimieren konnten oder sollten:)).

Und dann gibt es Cython , mit dem Sie normales Python schreiben und es mit Teilen mischen können, die direkt in C konvertiert werden Code. Dies hat den Vorteil einer besseren Wartbarkeit und Lesbarkeit gegenüber Fortran (und C) mit der Leistung von C, wobei Sie die meisten, wenn nicht alle Python-Konstrukte auf hoher Ebene verwenden können, sowie direkt in reinen Python-Code und reinen Aufruf C-Code / Bibliotheken (und wahrscheinlich Fortran-Code / Bibliotheken: Ссылка ). Sie können auch die leistungskritischen (CPU-gebundenen) Teile Ihres Codes in Cython schreiben und direkt von Python aufrufen.

    
Erik Allik 07.10.2013, 16:02
quelle
1

Wenn Ihr bestimmter Compiler und das verfügbare Toolset nicht besonders kontraproduktiv sind, ist eine Programmiersprache in der Lage, IO genauso schnell auszuführen wie ein anderer. In vielen Programmiersprachen ist ein naive Ansatz möglicherweise nicht optimal - wie bei allen leistungsbezogenen Aspekten der Programmierung wird dies durch entsprechendes Design und die entsprechende Nutzung der verfügbaren Werkzeuge (wie Parallelverarbeitung, Nutzung von gepufferten, Threaded IO, zum Beispiel).

Python ist nicht besonders schlecht bei IO, bietet gepufferte IO- und Threading-Fähigkeiten und ist leicht mit C zu erweitern (und daher wahrscheinlich nicht so schwer mit Fortran zu interagieren). Python ist wahrscheinlich eine völlig vernünftige Technologie, um Teile Ihrer Codebasis inkrementell zu ersetzen - in der Tat, wenn Sie zuerst in Python schnell machen können, können Sie wahrscheinlich eine Erweiterung kompilieren, die letztendlich Ihren Fortran-Code aufruft.

    
Marcin 07.10.2013 15:58
quelle

Tags und Links