Ich habe eine Python 3.6 Alpha-Build aus dem Python Github-Repository heruntergeladen, und eine meiner beliebtesten neuen Funktionen ist literale String-Formatierung. Es kann wie so verwendet werden:Warum sind literal formatierte Zeichenfolgen in Python 3.6 alpha so langsam? (jetzt in 3.6 stabil behoben)
>>> x = 2
>>> f"x is {x}"
"x is 2"
Dies scheint die gleichen wie mit der format
Funktion auf einer str
Instanz zu tun. Eine Sache, die ich bemerkt habe, ist jedoch, dass diese literale String-Formatierung tatsächlich sehr langsam ist, verglichen mit dem Aufruf von format
. Hier ist, was timeit
sagt über jede Methode:
>>> x = 2
>>> timeit.timeit(lambda: f"X is {x}")
0.8658502227130764
>>> timeit.timeit(lambda: "X is {}".format(x))
0.5500578542015617
Wenn ich eine Zeichenfolge als timeit
‚s Argument verwenden, werden meine Ergebnisse immer noch das Muster zeigt:
>>> timeit.timeit('x = 2; f"X is {x}"')
0.5786435347381484
>>> timeit.timeit('x = 2; "X is {}".format(x)')
0.4145195760771685
Wie Sie sehen können, mit format
dauert fast die Hälfte der Zeit. Ich würde erwarten, dass die literale Methode schneller ist, weil weniger Syntax involviert ist. Was passiert hinter den Kulissen, wodurch die literale Methode so viel langsamer wird?
f-Strings sind dynamisch, daher muss der String in jeder Schleife generiert werden; während die Format-Zeichenfolge ein Literal ist, das erstellt wird, bevor der Code ausgeführt wird, wenn er in Bytecode konvertiert wird. –
@AlexHall Vielleicht hat dies mit der Tatsache zu tun, dass 'x' einer lokalen Variablen zugewiesen wird, wenn sie an die' format' Methode übergeben wird, aber in 'globals' durch' f "..." 'gefunden werden muss Syntax. – schwobaseggl
@AlexHall: Dies ist kein Fehler. Es gibt einfach eine andere Implementierung unter der Haube, da der Formatstring zur Kompilierzeit geparst werden muss, während 'str.format()' die Slots nach * runtime * analysiert. –