1

我做了这个测试

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

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

4

2 回答 2

7

对一小段代码的一次执行计时并不能告诉你太多。特别是,如果您查看 和 中的计时数字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. object.c(请在新窗口中打开此代码以跟随我的其余分析。)在第 817 行,您将看到如果被比较的对象是相同类型并且它们tp_compare的类结构中有函数,那么该函数叫做。在整数对象的情况下,会发生这种情况,函数int_compareinintobject.c,您将看到它非常简单。

但是字符串没有tp_compare函数,因此do_cmp继续调用try_rich_to_3way_compare,然后调用try_rich_compare_bool最多 3 次(依次尝试三个比较运算符 EQ、LT 和 GT)。这调用try_rich_comparewhich调用string_richcomparestringobject.c

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

于 2013-01-18T14:42:43.160 回答
0

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

于 2013-01-18T14:15:33.347 回答