为何直接使用`x in (y, z...)`比在已定义元组中查找x更快?
元组成员检测的反直觉性能现象
我最近在测试不同的成员检测实现时,发现了一个挺有意思的反常现象:
测试场景1:直接使用字面量长元组检测
执行IPython魔法命令:
%timeit 10 in (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
得到的结果是:
1000000 loops, best of 3: 230 ns per loop
测试场景2:使用变量指向的短元组检测
先定义元组变量:
t = (0, 1)
再执行检测命令:
%timeit 10 in t
测试时出现了缓存相关提示:
The slowest run took 4.48 times longer than the fastest. This could mean that an intermediate result is being cached
最终的耗时结果是:
1000000 loops, best of 3: 246 ns per loop
这个现象在Python 2.7.12和3.4.5版本中都能复现,只是不同版本的具体耗时数值略有差异。
显然,这和我们的直觉完全相反——更长的元组做成员检测,耗时反而比短元组更低。
背后的核心原因在于Python的编译期优化:当检测表达式中直接使用字面量元组时,Python解释器会在编译阶段对这段逻辑做针对性优化,比如提前处理部分比较逻辑,生成更高效的字节码;而如果是通过变量引用元组,解释器无法在编译期确定元组的内容,只能在运行时执行逐个元素遍历比较的逻辑,再加上变量查找的额外开销,最终导致短元组的检测耗时反而更高。
另外测试中出现的缓存提示,是因为短元组的检测路径更容易受到解释器缓存机制的影响,导致不同运行批次的耗时波动较大,而字面量长元组的优化路径更稳定,所以耗时结果更一致。
内容的提问来源于stack exchange,提问作者musicamante
相关产品推荐
相关产品推荐

