为什么在Python中字符串比较不比整数比较快?

时间:2020-11-03 07:26:09

标签: python string-comparison

C ++的差异很大,但Python却没有。我在C ++上使用了类似的代码,结果是如此不同-整数比较比字符串比较快20-30倍。

这是我的示例代码:

import random, time
rand_nums = []
rand_strs = []
total_num = 1000000
for i in range(total_num):
    randint = random.randint(0,total_num*10)
    randstr = str(randint)
    rand_nums.append(randint)
    rand_strs.append(randstr)

start = time.time()
for i in range(total_num-1):
    b = rand_nums[i+1]>rand_nums[i]
end = time.time()
print("integer compare:",end-start)     # 0.14269232749938965 seconds

start = time.time()
for i in range(total_num-1):
    b = rand_strs[i+1]>rand_strs[i]
end = time.time()                       # 0.15730643272399902 seconds
print("string compare:",end-start)

2 个答案:

答案 0 :(得分:3)

我无法解释为什么它在C ++中这么慢,但是在Python中,原因很简单,那就是您的测试代码:随机字符串通常在第一个字节中有所不同,因此这些情况下的比较时间应该大致相同

此外,循环控制和列表访问也不会花费太多。如果您通过zip筛选列表来删除这些因素,则可以得到更加准确的测量结果:

for s1, s2 in zip(rand_strs, rand_strs[1:]):
    b = s1 > s2

答案 1 :(得分:2)

C ++的差异很大,而Python则没有。

与Python中循环的其余部分相比,用于比较的时间最少。实际的比较操作是在Python的标准库C代码中实现的,而循环将通过解释器执行。

作为测试,您可以运行此代码,该代码执行与字符串比较循环相同的所有操作,除非不进行比较:

start = time.time()
for i in range(total_num-1):
    b = rand_strs[i+1], rand_strs[i]
end = time.time()
print("no compare:",end-start)

时间非常接近,尽管对我而言,字符串比较始终是三个循环中最慢的一个:

integer compare: 1.2947499752044678
string compare: 1.3821675777435303
no compare: 1.3093421459197998