'%s' % 100000
コンパイラによって評価され、実行時の定数と同等です。
>>> 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
%
ランタイム式を使用すると、(大幅に)次よりも速くなりませんstr
。
>>> Timer('str(x)', 'x=100').timeit()
0.25641703605651855
>>> Timer('"%s" % x', 'x=100').timeit()
0.2169809341430664
str
@DietrichEppが言ったように、それでも少し遅いことに注意してください。これは、単一の即時バイトコードにコンパイルするときに、str
ルックアップと関数呼び出しの操作が含まれるため%
です。
>>> 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
もちろん、上記は私がテストしたシステム(CPython 2.7)にも当てはまります。他の実装は異なる場合があります。
'{}'.format(100000)