[PYTHON] Pypy Bool Typ ist langsam

Fix

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.

Was ich sagen will

Wenn Sie pypy in der Wettbewerbsprogrammierung verwenden, ist es langsam, True / False als Bool-Typ zu behandeln. Verwenden wir den Typ int.

Überblick

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.

Experiment

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)

Erwägung

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.

Bonus

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

Nachtrag

Als ich es mit Python3 ausführte, lag es im Fehlerbereich. Vielen Dank an @shiracums für den Hinweis.

Recommended Posts

Pypy Bool Typ ist langsam
pandas idxmax ist langsam
PyTorch DataLoader ist langsam
Die Pipenv-Verriegelung ist zu langsam
Der Rückgabewert der Python-Booleschen Operation ist nicht immer vom Bool-Typ
Was ist besser, PyPy oder Python?