【问题标题】:In practice, why compare integer is better than compare string?在实践中,为什么比较整数比比较字符串好?
【发布时间】:2013-01-02 05:28:20
【问题描述】:

我做了这个测试

import time
def test1():
    a=100
    b=200
    start=time.time()
    if (a>b):
        c=a
    else:
        c=b
    end=time.time()
    print(end-start)


def test2():
    a="amisetertzatzaz1111reaet"
    b="avieatzfzatzr333333ts"
    start=time.time()

    if (a>b):
        c=a
    else:
        c=b
    end=time.time()
    print(end-start)

 def test3():
     a="100"
     b="200"
     start=time.time()

     if (a>b):
         c=a
     else:
         c=b
     end=time.time()
     print(end-start)

并得到结果

1.9073486328125e-06    #test1()
9.5367431640625e-07    #test2()
1.9073486328125e-06    #test3()

执行时间相似。是的,使用整数代替字符串会减少存储空间,但执行时间呢?

【问题讨论】:

  • 你想知道的执行时间是多少?
  • @martineau:我会理解为什么通常说使用整数比使用字符串更好; GarethRees 给了我一个很好的方向

标签: python time python-3.x comparison


【解决方案1】:

为一小段代码的单次执行计时并不能告诉您太多信息。特别是,如果您查看test1test3 中的计时数字,您会发现数字是相同的。这应该是一个警告信号,事实上,您在这里看到的只是计时器的分辨率:

>>> 2.0 / 2 ** 20
1.9073486328125e-06
>>> 1.0 / 2 ** 20
9.5367431640625e-07

为了获得更好的结果,您需要多次运行代码,并测量并减去计时开销。 Python 有一个内置模块 timeit 可以做到这一点。让我们计算每种比较的 1 亿次执行次数:

>>> from timeit import timeit
>>> timeit('100 > 200', number=10**8)
5.98881983757019
>>> timeit('"100" > "200"', number=10**8)
7.528342008590698

所以您可以看到差异并没有那么大(在这种情况下,字符串比较只慢了大约 25%)。那么为什么字符串比较比较慢呢?嗯,找出来的方法是看比较操作的实现。

在 Python 2.7 中,比较由 do_cmp function in object.c 实现。 (请在新窗口中打开此代码以跟随我的其余分析。)在第 817 行,您将看到,如果被比较的对象是相同的类型,并且它们的类结构中是否有 tp_compare 函数,然后调用该函数。在整数对象的情况下,会发生这种情况,函数为int_compare in intobject.c,您将看到它非常简单。

但字符串没有tp_compare 函数,所以do_cmp 继续调用try_rich_to_3way_compare,然后再调用try_rich_compare_bool 最多3 次(依次尝试三个比较运算符EQ、LT 和GT)。这调用了try_rich_compare,它调用了string_richcompare in stringobject.c

所以字符串比较比较慢,因为它必须使用复杂的“丰富比较”基础设施,而整数比较更直接。但即便如此,也没什么太大的区别。

【讨论】:

  • 在您的示例中,“100”和“200”只能通过查看第一个字符进行比较。但是尝试比较,例如("123456789" > "123456788") 与 (123456789 > 123456788)。
  • @NikolayVyahhi:你真的尝试过计时吗?需要比较的每个额外字符都会增加不到 2% 的比较时间,因此对于短字符串,最重要的因素仍然是我在回答中描述的“丰富比较”开销。
  • @GarethRees:谢谢,你的解释很清楚。我也明白,就执行时间而言,差异并不显着,字符串比较比整数比较慢,但差异也不算太差,不是吗?
【解决方案2】:

嗯?由于减少了存储空间,因此需要比较的位数也减少了。比较位是工作,做更少的工作意味着它会更快。

【讨论】:

  • 我认为不可能编写一个比两个字节更快地比较两个位的函数。我错过了什么吗?
  • @MatthieuLatapy 不,对于大多数现代通用指令集,我猜一个字节是可以处理的最小信息量。但答案不是关于这种情况,而是比较整数与比较字符串。一般来说,“更少的比特 = 更少的工作”是正确的,但典型的实用计算机会量化事物,因此它不是线性关系。
猜你喜欢
  • 2011-06-21
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 2020-02-23
  • 2013-05-06
  • 1970-01-01
  • 2013-09-03
相关资源
最近更新 更多