从您发布的链接:
避免大型.pyc文件
那么为什么不
'a' * 21 is'aaaaaaaaaaaaaaaaaaaaa'评价True呢?您还记得所有软件包中遇到的.pyc文件吗?好吧,Python字节码存储在这些文件中。如果有人写了这样的话会怎样['foo!']* 10**9?生成的 .pyc 文件将很大!为了避免这种现象,如果通过窥孔优化生成的序列长度大于20,则将其丢弃。
如果您有字符串
"HelloHelloHelloHelloHello",Python将必须按原样存储它(要求解释器检测字符串中的重复模式以节省空间可能太多了)。但是,当涉及到可以在解析时计算的字符串值时,例如
"Hello"* 5,Python将这些值作为所谓的“窥孔优化”的一部分进行评估,后者可以决定是否值得对字符串进行预计算。由于
len("Hello" * 5) >20,解释程序将其保留原样,以避免存储太多长字符串。编辑:
如该问题所示,您可以在
peephole.c函数的源代码中对此进行检查
fold_binops_on_constants,最后将看到:
// ...} else if (size > 20) { Py_DECREF(newconst); return -1;}编辑2:
实际上
,该优化代码最近已移至适用于Python
3.7的AST优化器中,因此,您现在必须调查一下
ast_opt.cfunction函数
fold_binop,该函数现在调用now函数
safe_multiply,该函数检查字符串是否不超过
MAX_STR_SIZE,新定义为4096。因此,似乎对于下一个版本的限制已大大提高。



