为什么python中的整数替换%s比%d快?

2024-04-25 08:04:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在查看所提到的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"比{}快呢?在


Tags: ofin示例returndefloadbestns
1条回答
网友
1楼 · 发布于 2024-04-25 08:04:36

这是在hacker news中讨论过的,我正在格式化@nikital答案,以便:

^{}中的函数PyString_Format执行%运算符的格式化。对于%s,它调用_PyObject_Str,后者反过来调用对象上的str()。对于%d,它调用formatint(位于同一个文件中)。在

ints的str()实现在int_to_decimal_stringin(^{})中,非常简单:

do {
    * p = '0' + (char)(absn % 10);
    absn /= 10;
} while (absn);

formatint的代码要复杂得多,它包含对本机snprintf的两个调用:

^{pr2}$

原生的snprintf更重,因为它处理精度、零填充和类似的事情。在

我相信这就是%d速度慢的原因。%s是一个直接的“除以10减去”循环,而{}是对完整的{}的两个库调用。然而,我并没有实际分析代码,因为我没有调试版本,所以我可能完全错了。在

相关问题 更多 >

    热门问题