python何时编译常量字符串,将常量字符串组合成一个常量字符串

时间:2013-01-24 03:03:06

标签: python

,例如

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)。

2 个答案:

答案 0 :(得分:9)

只要组合字符串不超过20个字符,就会发生这种情况。

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

答案 1 :(得分:4)

@Raymond Hetting's answer很棒,为此投票(我做了)。我将此作为评论,但您无法在评论中格式化代码。

如果超过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)

但是如果您有两个字符串文字,请记住您可以省略+并使用String literal concatenation来避免BINARY_ADD(即使组合字符串长度大于20): / p>

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