【发布时间】:2012-09-28 22:08:12
【问题描述】:
我正在尝试评估比较两个字符串是否会随着长度的增加而变慢。我的计算表明比较字符串应该花费一个摊销的常数时间,但我的 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 是它们的长度,则可以使用以下sn-p 来尝试重现该问题.
timeit.timeit("for i in range(COUNT): v1[i] == v2[i]",
"from __main__ import COUNT, v1, v2", number=50)
补充说明:我做了两个额外的测试:用is而不是==比较字符串完全抑制了问题,性能大约是210ms/1M比较。
由于提到了实习,我确保在每个字符串后添加一个空格,这应该可以防止实习;这不会改变任何事情。那除了实习还有别的事吗?
【问题讨论】:
-
您可能应该包含 Python 的确切版本,以防万一它有所作为。
-
由于字符串是随机的,比较过程几乎总是在第一个字符处停止。所以你最有可能看到的只是内存管理问题——新建它们,用随机内容填充它们等等。
-
@MikeDunlavey:Python 不会逐个字符地比较字符串 - 它使用字符串的哈希值来进行比较。
-
@Mike,我不是在计时,只是比较。
-
我很难相信 y 轴是正确的。比较两个长度为 5 的字符串不应该花费 200 毫秒。在 2012 年 也许 微秒。在我的 Intel i7 CPU(64 位)上,它需要不到一纳秒的时间25 个字符(当它们匹配时,不会发生短路)。有些东西闻起来很腥......伙计们快跑吧:
%time 'asdfsdsfsadfdsf' == 'asdfsdsfsadfdsf'
标签: python string performance time-complexity