'%s' % 100000
se evalúa por el compilador y es equivalente a una constante en tiempo de ejecución.
>>> import dis
>>> dis.dis(lambda: str(100000))
8 0 LOAD_GLOBAL 0 (str)
3 LOAD_CONST 1 (100000)
6 CALL_FUNCTION 1
9 RETURN_VALUE
>>> dis.dis(lambda: '%s' % 100000)
9 0 LOAD_CONST 3 ('100000')
3 RETURN_VALUE
%
con una expresión de tiempo de ejecución no es (significativamente) más rápido que str
:
>>> Timer('str(x)', 'x=100').timeit()
0.25641703605651855
>>> Timer('"%s" % x', 'x=100').timeit()
0.2169809341430664
tenga en cuenta que str
es todavía un poco más lento, como dijo @DietrichEpp, esto se debe a str
implica operaciones de búsqueda y funciones de llamada de función, mientras que %
se compila en un solo bytecode inmediato:
>>> dis.dis(lambda x: str(x))
9 0 LOAD_GLOBAL 0 (str)
3 LOAD_FAST 0 (x)
6 CALL_FUNCTION 1
9 RETURN_VALUE
>>> dis.dis(lambda x: '%s' % x)
10 0 LOAD_CONST 1 ('%s')
3 LOAD_FAST 0 (x)
6 BINARY_MODULO
7 RETURN_VALUE
Por supuesto, lo anterior es cierto para el sistema que probé (CPython 2.7); otras implementaciones pueden diferir.
Y qué tal '' {} '. Format (100000) ' – wim
Esa es la más lenta pero también la más flexible. –