Ursprünglich wurde es unter dem Titel "Python-Bool-Typ ist langsam" veröffentlicht, aber der Inhalt des Artikels gilt nur bei Verwendung von Pypy, was ein Fehler war. Es tut mir leid, dass ich Ihnen die falschen Informationen gegeben habe.
Wenn Sie pypy in der Wettbewerbsprogrammierung verwenden, ist es langsam, True / False als Bool-Typ zu behandeln. Verwenden wir den Typ int.
Ich denke, es ist üblich, eine Art Flag zu haben und den Prozess entsprechend zu verzweigen.
f = 1
Einige Leute
f = True
Ich bin mir sicher, dass es Leute gibt, die das sagen, aber ich erwarte, dass in beiden Fällen dasselbe passiert.
In der Realität gibt es jedoch einen Unterschied in der Ausführungsgeschwindigkeit.
Um genau zu sein, gibt es keinen Unterschied in der Beurteilung des Wahrheitswertes, und es gibt einen Unterschied in der Umschreibung. Ich werde später darüber sprechen.
Vergleichen wir mit dem folgenden Code. Die Ausführungsumgebung ist PyPy3 (3.7.0) im Codetest von atcoder.
int.py
f = 1
for i in range(10**9):
if f:
f = 0
else:
f = 1
bool.py
f = True
for i in range(10**9):
if f:
f = False
else:
f = True
Das Ergebnis sieht so aus. (Auch wenn Sie es mehrmals tun, sieht es so aus)
Code | Ausführungszeit | Erinnerung |
---|---|---|
int.py | 2423 ms | 25640 KB |
bool.py | 7439 ms | 25612 KB |
Ist der Unterschied nicht größer als ich erwartet hatte? ?? Dies allein erhöht das Risiko von TLE, wenn die Ausführungsgeschwindigkeit ein ernstes Problem darstellt. (Eigentlich war ich süchtig nach ABC182 E)
Es handelt sich also nur um die Verwendung von Pypy in der Wettbewerbsprogrammierung. Wenn Sie jedoch Flags verwenden möchten, verwenden Sie den Typ int anstelle des Typs bool.
Ich habe verschiedene Experimente versucht, aber es schien nicht das Wahrheitsurteil zu sein, sondern das Umschreiben des Wertes, das den Geschwindigkeitsunterschied beeinflusste.
Bitte beachten Sie, dass das Umschreiben eine Voraussetzung für die Verwendung als Flag ist. Wenn Sie beispielsweise eine Flagge in der Mitte setzen und danach beibehalten, sollte es keinen Geschwindigkeitsunterschied geben. Wenn Sie es stehen oder falten, können Sie aus einem so trivialen Grund TLE.
Sofern Sie nicht besonders darauf eingehen, empfehlen wir die Verwendung des Typs int.
Ich habe auch versucht, str.
str.py
a = "True"
for i in range(10**9):
if a == "True":
a = "False"
else:
a = "True"
Die Ergebnisse sind wie folgt. Es ist das langsamste, nicht wahr?
Ausführungszeit | Erinnerung |
---|---|
8183 ms | 25612 KB |
Als ich es mit Python3 ausführte, lag es im Fehlerbereich. Vielen Dank an @shiracums für den Hinweis.