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

在Python中,为什么字符串比较不如整数比较快? < C++中的差异很大,但在Python中没有。我在C++上使用了类似的代码,结果是如此的不同,整数比较是字符串比较的20-30倍。,python,string-comparison,Python,String Comparison,下面是我的示例代码: 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 = t

下面是我的示例代码:

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)

我无法解释C++中为什么这么慢,但是在Python中,原因很简单:测试字符串中的随机字符串通常不同,所以这些情况的比较时间应该是差不多的。 此外,在循环控制和列表访问中不会有太多开销。如果您通过

zip
ping列表删除这些因素,您将获得更准确的度量:

for s1, s2 in zip(rand_strs, rand_strs[1:]):
    b = s1 > s2
< 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

嗯,有些词换了位置了吗?在主题中,您会问“为什么字符串比较不比整数比较快”,而在文本中,您会说“整数比较比整数比较快30倍”。这使得读问题变得很混乱,因为Python不是C++吗?Python是一种高级语言,您生成的时间主要取决于循环基于迭代器的for循环的实际成本,以及IInding到数据结构的成本(这涉及函数调用,在Python中成本很高)。与其他方面相比,实际的比较非常小。