在实践中,为什么比较整数比比较字符串好?

时间:2013-01-18 13:31:54

标签: python time python-3.x comparison

我做了这个测试

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()

执行时间类似。这是真的,使用整数而不是字符串减少存储空间但是执行时间呢?

2 个答案:

答案 0 :(得分:6)

单次执行一小段代码的时间并不能完全告诉你。特别是,如果您查看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最多三次(尝试三个比较运算符EQ) ,LT和GT依次)。这会调用调用try_rich_comparestring_richcompare in stringobject.c

因此字符串比较较慢,因为它必须使用复杂的“丰富比较”基础结构,而整数比较更直接。但即便如此,它也没有那么大的差别。

答案 1 :(得分:0)

咦?由于存储空间减小,因此需要比较的比特数也减少。比较位是有效的,减少工作意味着它更快。