Skip to main content
 首页 » 编程设计

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

2025年05月04日22leader

我做了这个测试

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

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

请您参考如下方法:

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

>>> 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_compare这叫string_richcompare in stringobject.c .

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