我正在尝试评估比较两个字符串是否会随着长度的增加而变慢。我的计算表明比较字符串应该花费一个摊销的常数时间,但我的 Python 实验产生了奇怪的结果:
这是字符串长度(1 到 400)与时间(以毫秒为单位)的关系图。自动垃圾收集被禁用,并gc.collect
在每次迭代之间运行。
我每次比较 100 万个随机字符串,计数匹配如下。该过程重复 50 次,然后取所有测量时间的最小值。
for index in range(COUNT):
if v1[index] == v2[index]:
matches += 1
else:
non_matches += 1
什么可能导致长度 64 左右突然增加?
注意:以下代码段可用于尝试重现问题,假设v1
和v2
是两个长度的随机字符串列表,n
而 COUNT 是它们的长度。
timeit.timeit("for i in range(COUNT): v1[i] == v2[i]",
"from __main__ import COUNT, v1, v2", number=50)
进一步说明:我做了两个额外的测试:比较 string withis
而不是==
完全抑制问题,性能约为 210ms/1M 比较。由于提到了实习,我确保在每个字符串后添加一个空格,这应该可以防止实习;这不会改变任何事情。那除了实习之外还有别的吗?