Schnellste stdin/out IO in python 3?
Ich habe die Lösung ein paar Probleme auf SPOJ.pl mit python 3.1.2 und einige Völker schnelle Ergebnis auf einfache Probleme macht mich Frage mich, ob es eine schnellere Möglichkeit zum verarbeiten von Eingabe und Ausgabe.
Ich habe versucht, mit
input()
print()
und
sys.stdin.readline()
sys.stdout.write()
oder eher
for line in sys.stdin:
#Handle input
sys.stdout.write(output)
Bearbeitung jeder Zeile.
Ich habe auch versucht alle zu sammeln Ausgabe in Listen und drucken Sie Sie alle auf einmal, wenn alles verarbeitet wird.
Aber alle diese produzieren ähnliche Ausführungszeiten.
Gibt es einen schnelleren Weg, um Griff Eingabe und Ausgabe von stdin/out?
- Ich denke, wenn die Leute haben die schnellsten Ergebnisse, als Sie die Ursache nicht in den I/O Kram
- Es war meine erste Vermutung, aber es ist auch der Fall für Probleme, die nur umleiten Sie einige der input auf output direkt. Dies ist der Grund, warum ich die Frage gestellt habe.
- Python 3.1.2 ist nicht eine besonders gute version von Python zu verwenden für die performance-Messungen. Python 3.2.2 Strom ist für Python 3 und es wurden viele signifikante performance-Verbesserungen zwischen den Versionen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgende wird wahrscheinlich am schnellsten:
Lesen Sie alle Eingaben auf einmal mit
os.read(0, some_big_enough_number)
.Prozess der Ausgabe, sammeln die Ergebnisse in einer Liste
results
.Schreiben die Ausgabe, wenn Sie mit
os.write(1, "".join(results))
.Ich erinnere mich an einen Fall, wo ich bemerkte, dass
os.read()
undos.write()
sind manchmal schneller als mit Python-I/O, aber ich erinnere mich nicht an die details.1000000000
. Es muss einfach genug sein, zum Lesen der Eingabe.Wahrscheinlich nicht.
Am Ende
print
rufensys.stdout.write()
. Aber daprint
ist eine integrierte Funktion, wahrscheinlich implementiert in C könnte es sogar schneller sein als der Aufrufsys.stdout.write()
.Da alle IO hat zu gehen durch das Objekt, das
sys.stdout
gibt, das ist der Flaschenhals. Das gleiche gilt fürsys.stdin
.Es gibt keine magischen tricks, um diese schneller.
Wenn Sie eine schnellere IO, versuchen Sie, diese Dinge:
buffer
- Befehl in ein kleines shell-Skript).[BEARBEITEN] Scheint SPOJ.pl ist eine Art von Programmierer shootout-Website. In diesem Fall I/O-Geschwindigkeit ist nicht der Täter: Sie haben mit einem schlechten Algorithmus, um das problem zu lösen.
Den speed-Unterschied zwischen einer guten und fairen Leistung kann leicht zwischen 10 und 100'000 mal. Durch ändern von ein paar Zeilen code, könnte ich mal den code ausführen, der in weniger als 5 Sekunden, dauerte 45 Minuten vor.
SPOJ.pl
berechnet mal laufen, aber Sie werden bezahlen für den Python-interpreter zu starten und byte-kompilieren Sie Ihre Python-Skript...SPOJ können Sie wählen unter einer Vielzahl von Programmiersprachen. Vergleichen Sie Ihr Ausführungszeit zu anderen Lösungen, die in anderen Programmiersprachen geschrieben?
Nur zum Spaß, legte ich die folgenden Lösungen für das erste problem (codename
TEST
) zu vergleichen, Laufzeiten.C++ - Lösung (G++ 4.3.2)
Sehen die Vorlage.
Python (2.5) - Lösung
Sehen die Vorlage.
Fazit
Bin ich mir nicht 100% sicher, dass er die beste performance in beiden Sprachen, aber es gibt nicht so viel code drin zu optimieren.
Komme ich mal
0.00
Messung für die C++ und0.04
Messung für den Python-code. Vorausgesetzt, die Reihenfolge der zahlen vorgelegt beiden Programmen ist das gleiche, ich denke, dass der Vergleich der Laufzeiten, gegen die Lösungen in den anderen Sprachen ist fast bedeutungslos (siehe nächsten Absatz).Nun, dies gilt nur für einfache Probleme. Die meisten fortgeschrittenen Probleme erfordern die Wahl des richtigen Algorithmus für das problem und die Wahl des falschen hat drastische Folgen. In diesen Fällen sorgfältig gestaltete Python-Lösungen könnte es noch langsamer sein als sorgfältig gestaltete C++ - Lösungen, aber die gute Python-Lösung schlagen wird, eine naive Lösung geschrieben in einer anderen Sprache.