我正在查看所提到的here示例,并查看{a2}。我在ipython上运行了下面的一个示例,结果是一致的,即"%d"
比"%s"
慢:
In [1]: def m1():
...: return "%d" % (2*3/5)
In [2]: def m2():
...: return "%s" % (2*3/5)
In [4]: %timeit m1()
1000000 loops, best of 3: 529 ns per loop
In [5]: %timeit m2()
1000000 loops, best of 3: 192 ns per loop
In [6]: from dis import dis
In [7]: dis(m1)
2 0 LOAD_CONST 1 ('%d')
3 LOAD_CONST 5 (6)
6 LOAD_CONST 4 (5)
9 BINARY_DIVIDE
10 BINARY_MODULO
11 RETURN_VALUE
In [9]: dis(m2)
2 0 LOAD_CONST 1 ('%s')
3 LOAD_CONST 5 (6)
6 LOAD_CONST 4 (5)
9 BINARY_DIVIDE
10 BINARY_MODULO
11 RETURN_VALUE
这两个代码块是相似的,甚至反汇编程序的输出也是一样的,那么为什么"%s"
比{
这是在hacker news中讨论过的,我正在格式化@nikital答案,以便:
^{} 中的函数
PyString_Format
执行%
运算符的格式化。对于%s
,它调用_PyObject_Str
,后者反过来调用对象上的str()
。对于%d
,它调用formatint
(位于同一个文件中)。在ints的} )中,非常简单:
str()
实现在int_to_decimal_string
in(^{
^{pr2}$formatint
的代码要复杂得多,它包含对本机snprintf的两个调用:原生的
snprintf
更重,因为它处理精度、零填充和类似的事情。在我相信这就是}是对完整的{}的两个库调用。然而,我并没有实际分析代码,因为我没有调试版本,所以我可能完全错了。在
%d
速度慢的原因。%s
是一个直接的“除以10减去”循环,而{相关问题 更多 >
编程相关推荐