我做了这个测试
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()
执行时间类似。这是真的,使用整数而不是字符串减少存储空间但是执行时间呢?
答案 0 :(得分:6)
单次执行一小段代码的时间并不能完全告诉你。特别是,如果您查看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
。
因此字符串比较较慢,因为它必须使用复杂的“丰富比较”基础结构,而整数比较更直接。但即便如此,它也没有那么大的差别。
答案 1 :(得分:0)
咦?由于存储空间减小,因此需要比较的比特数也减少。比较位是有效的,减少工作意味着它更快。