我试图评估比较两个字符串是否会随着其长度的增加而变慢。我的计算表明,比较字符串应该花费一个摊销后的恒定时间,但我的Python实验产生了奇怪的结果。
下面是一个字符串长度(1到400)与时间的关系图,单位是毫秒。自动垃圾收集被禁用,
gc.collect
在每次迭代之间运行。
我每次都要比较100万个随机字符串,按以下方式计算匹配度。在取所有测量时间的最小值之前,这个过程要重复50次。
for index in range(COUNT):
if v1[index] == v2[index]:
matches += 1
else:
non_matches += 1
是什么原因导致了长度64左右的突然增加?
Note:假设v1
和v2
是两个长度为n
的随机字符串列表,COUNT是它们的长度,可以用下面的片段来尝试重现该问题。
timeit.timeit("for i in range(COUNT): v1[i] == v2[i]",
"from __main__ import COUNT, v1, v2", number=50)
Further note:我做了两个额外的测试:用is
而不是==
来比较字符串,完全抑制了这个问题,而且性能大约是210ms/1M的比较。
既然有人提到了交互,我确保在每个字符串后面添加一个空白,这应该可以防止交互;这并没有改变什么。那么是不是除了打断之外还有其他原因呢?