从您发布的链接:
那么为什么不'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.c
function函数fold_binop
,该函数现在调用Now函数safe_multiply
,该函数检查字符串是否不超过MAX_STR_SIZE
,新定义为4096。因此,似乎对于下一个版本的限制已大大提高。