为什么字符串比较没有 Python 中的整数比较快?
Why string comparison is NOT faster then integer comparison in Python?
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)
我无法解释为什么它在 C++ 中这么慢,但在 Python 中,原因很简单,从您的测试代码来看:随机字符串通常在第一个字节不同,因此这些情况的比较时间应该差不多吧。
此外,循环控制和列表访问中不会有太多开销。如果您通过 zip
ping 列表来删除这些因素,您将获得更准确的衡量标准:
for s1, s2 in zip(rand_strs, rand_strs[1:]):
b = s1 > s2
The difference in C++ is huge, but not in 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
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)
我无法解释为什么它在 C++ 中这么慢,但在 Python 中,原因很简单,从您的测试代码来看:随机字符串通常在第一个字节不同,因此这些情况的比较时间应该差不多吧。
此外,循环控制和列表访问中不会有太多开销。如果您通过 zip
ping 列表来删除这些因素,您将获得更准确的衡量标准:
for s1, s2 in zip(rand_strs, rand_strs[1:]):
b = s1 > s2
The difference in C++ is huge, but not in 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