【问题标题】:Why string comparison is NOT faster then integer comparison in Python?为什么字符串比较不比 Python 中的整数比较快?
【发布时间】:2020-11-03 07:26:09
【问题描述】:

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)

【问题讨论】:

  • 嗯,有些词换了地方吗?在主题中您问“为什么字符串比较不比整数比较快”,在文本中您说“整数比较比整数比较快 30 倍”。这使得这个问题读起来很混乱。
  • 因为 Python 不是 C++? Python 是一种高级语言,您生成的时间取决于诸如循环基于迭代器的 for 循环的实际成本、索引数据结构的成本(这涉及函数调用,这是昂贵的)在 Python 中)。与其他一切相比,实际比较非常小。

标签: python string-comparison


【解决方案1】:

我无法解释为什么它在 C++ 中这么慢,但在 Python 中,原因很简单,从您的测试代码来看:随机字符串通常在第一个字节中不同,因此这些情况的比较时间应该几乎相同.

此外,循环控制和列表访问中的开销并不大。如果您通过zipping 列表删除这些因素,您将获得更准确的衡量标准:

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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2011-06-21
      • 2012-02-09
      • 2013-01-02
      • 2013-05-06
      • 1970-01-01
      • 2022-03-30
      • 2018-10-01
      • 2020-09-15
      • 2020-02-23
      相关资源
      最近更新 更多