在分析一段 python 代码时(python 2.6
up to 3.2
),我发现str
将对象(在我的例子中是整数)转换为字符串的方法几乎比使用字符串格式化慢一个数量级。
这是基准
>>> from timeit import Timer
>>> Timer('str(100000)').timeit()
0.3145311339386332
>>> Timer('"%s"%100000').timeit()
0.03803517023435887
有谁知道为什么会这样?
我错过了什么吗?
'%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)来说是正确的;其他实现可能有所不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)