我做了这个测试
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 .
因此字符串比较速度较慢,因为它必须使用复杂的“丰富比较”基础设施,而整数比较则更为直接。但即便如此,也没有太大区别。
