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

KKc*_*KKc 1 python comparison time python-3.x

我做了这个测试

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)
Run Code Online (Sandbox Code Playgroud)

并获得结果

1.9073486328125e-06    #test1()
9.5367431640625e-07    #test2()
1.9073486328125e-06    #test3()
Run Code Online (Sandbox Code Playgroud)

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

Gar*_*ees 6

单个执行一小段代码的时间并不能完全告诉你.特别是,如果你看看从你的时序数test1test3,你会看到的数字是相同的.这应该是一个警告信号,事实上,你在这里看到的只是计时器的分辨率:

>>> 2.0 / 2 ** 20
1.9073486328125e-06
>>> 1.0 / 2 ** 20
9.5367431640625e-07
Run Code Online (Sandbox Code Playgroud)

为了获得更好的结果,您需要多次运行代码,并测量和减去时序开销.Python有一个内置的模块timeit来完成这个.让我们为每种比较执行1亿次执行:

>>> from timeit import timeit
>>> timeit('100 > 200', number=10**8)
5.98881983757019
>>> timeit('"100" > "200"', number=10**8)
7.528342008590698
Run Code Online (Sandbox Code Playgroud)

所以你可以看到差异实际上并不是那么多(字符串比较在这种情况下只有约25%).那么为什么字符串比较慢呢?那么,找出的方法是看比较操作的实现.

在Python 2.7中,比较由do_cmp函数object.c实现.(请在新窗口中打开此代码以完成我的其余分析.)在第817行,您将看到如果被比较的对象是相同的类型,并且如果它们tp_compare的类结构中有一个函数,那么该函数叫做.在整数对象的情况下,这就是所发生的,函数int_compareintobject.c,你会看到非常简单.

但是字符串没有tp_compare函数,所以do_cmp进行调用try_rich_to_3way_compare然后调用try_rich_compare_bool最多三次(依次尝试三个比较运算符EQ,LT和GT).这就要求try_rich_compare它调用string_richcomparestringobject.c.

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