Ho scaricato una build alpha Python 3.6 dal repository Github Python e una delle mie nuove funzionalità preferite è la formattazione letterale delle stringhe. Può essere utilizzato in questo modo:Perché le stringhe in formato letterale sono così lente in Python 3.6 alpha? (ora fissato in 3.6 stabile)
>>> x = 2
>>> f"x is {x}"
"x is 2"
Questo sembra fare la stessa cosa come si utilizza la funzione format
su un'istanza str
. Tuttavia, una cosa che ho notato è che questa formattazione letterale delle stringhe è in realtà molto lenta rispetto alla semplice chiamata format
. Ecco cosa timeit
dice su ogni metodo:
>>> x = 2
>>> timeit.timeit(lambda: f"X is {x}")
0.8658502227130764
>>> timeit.timeit(lambda: "X is {}".format(x))
0.5500578542015617
Se io uso una stringa come argomento timeit
s', i miei risultati sono ancora mostrando il modello:
>>> timeit.timeit('x = 2; f"X is {x}"')
0.5786435347381484
>>> timeit.timeit('x = 2; "X is {}".format(x)')
0.4145195760771685
Come si può vedere, utilizzando format
prende quasi metà del tempo. Mi aspetto che il metodo letterale sia più veloce perché è implicata meno sintassi. Cosa sta succedendo dietro le quinte che fa sì che il metodo letterale sia molto più lento?
le stringhe di f sono dinamiche, quindi la stringa deve essere generata su ogni ciclo; mentre la stringa di formato è un valore letterale che viene creato prima dell'esecuzione del codice, quando viene convertito in bytecode. –
@AlexHall Forse questo ha a che fare con il fatto che 'x' è assegnato a una variabile locale quando viene passato al metodo' format', ma deve essere trovato in 'globals' dalla' f "..." ' sintassi. – schwobaseggl
@AlexHall: questo non è un bug. Esiste semplicemente una diversa implementazione sotto il cofano, dato che la stringa di formato deve essere analizzata in fase di compilazione, mentre 'str.format()' analizza gli slot in * runtime *. –