Python何时编译常量字符串,将字符串组合成单个常量字符串?

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)中哪个源代码文件涉及到此功能。


那不就是你的答案吗?你还有什么疑惑的地方? - Joel Cornett
我认为OP想知道'123'+'456'变成'123456'的地方。 - wim
1
@JoelCornett:'123 + 456' 的计算方式与 '123456' 完全相同。在 '123 + 456' 中似乎没有区分 '123''456' - inspectorG4dget
2个回答

11

6
我编写了Python的Peephole优化器 :-) - Raymond Hettinger
1
在查找可能是此问题的重复项时,我发现折叠已最近移至ast_opt.c,并且折叠字符串的最大大小现在定义为4096(MAX_STR_SIZE)。 - jdehesa

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接