6

In [9]: dis.disassemble(compile("s = '123' + '456'", "<execfile>", "exec"))
  1           0 LOAD_CONST               3 ('123456')
              3 STORE_NAME               0 (s)
              6 LOAD_CONST               2 (None)
              9 RETURN_VALUE 

我想知道,python 什么时候将常量字符串组合为CONST. 如果可能的话,请告诉我在 cpython(无论是 2.x、3.x)上的哪些源代码。

4

2 回答 2

11

只要组合字符串为 20 个字符或更少,就会发生这种情况。

优化发生在窥视孔优化器中。请参阅Python/peephole.cfold_binops_on_constants()函数中的第 219 行:http : //hg.python.org/cpython/file/cd87afe18ff8/Python/peephole.c#l149

于 2013-01-24T03:19:14.327 回答
4

@Raymond Hetting 的回答很棒,投票赞成(我做了)。我会将此作为评论,但您不能在评论中格式化代码。

如果超过 20 个字符的限制,反汇编代码如下所示:

>>> dis.disassemble(compile("s = '1234567890' + '09876543210'", "<execfile>", "exec"))
  1  0 LOAD_CONST  0 ('1234567890')
     3 LOAD_CONST  1 ('09876543210')
     6 BINARY_ADD
     7 STORE_NAME  0 (s)

但是在您有两个字符串文字的情况下,请记住您可以省略+并使用字符串文字连接来避免 BINARY_ADD(即使组合字符串长度大于 20):

>>> dis.disassemble(compile("s = '1234567890' '09876543210'", "<execfile>", "exec"))
  1  0 LOAD_CONST  0 ('123456789009876543210')
     3 STORE_NAME  0 (s)
于 2013-01-24T03:49:42.467 回答