我正在尝试测量python中contains((函数的性能。我通过使用python的时间模块来做到这一点。
下面是如下所示的代码:
from time import time
def contains(collection, target):
return target in collection
def performance():
n = 1024
while n < 50000000:
sorted = range(n)
now = time()
# code whose performance
#
# is to be evaluated
contains(sorted, -1)
done = time()
print(n, (done-now)*1000)
n *= 2
performance()
我遇到的问题是,即使我增加了小数位,我也总是观察到 0 时差。我缺少 time(( 模块中的一些标志。我也在使用python 3.7。我应该说我的机器没有那么快,无法在行之间传递 0 时间。
这是输出:
1024 0.0
2048 0.0
4096 0.0
8192 0.0
16384 0.0
32768 0.0
65536 0.0
131072 0.0
262144 0.0
524288 0.0
1048576 0.0
2097152 0.0
4194304 0.0
8388608 0.0
16777216 0.0
33554432 0.0
Process finished with exit code 0
我遇到的问题是,即使我增加了小数位,我也总是观察到 0 时差。
这是因为您正在计时的操作实际上是瞬时的。
range()
返回一个range
对象,而不是一个列表。这些对象可以像列表一样迭代,但它们使用优化的操作实现,如in
和索引。在这种情况下,in
的实现只需要检查数字是否在范围的最小值和最大值之间 - 此操作的速度不依赖于范围的大小。
如果你想用大型列表测试函数的性能,你需要将range
强制转换为list
,例如
sorted_numbers = list(range(n))
(应避免对变量使用名称sorted
,因为有一个具有该名称的内置函数。