python - 测量程序运行时间 + 一个对于列表的小实验

来源:互联网 发布:mox反应堆 知乎 编辑:程序博客网 时间:2024/04/30 01:53

在LeetCode的Path Sum2 点击打开链接 中,我提到了在函数传递参数为list的时候,list 与list[:]是不同的,并且list[:]看起来比较快,所以我做了一个测量这个传参过程的小实验。

首先说一下用来测量时间得timeit模块(大家可以放弃以前time模块了!)

timeit 模块定义了接受两个参数的 Timer 类。两个参数都是字符串。 第一个参数是你要计时的语句或者函数。 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入语句。 从内部讲, timeit 构建起一个独立的虚拟环境, 手工地执行建立语句,然后手工地编译和执行被计时语句。
一旦有了 Timer 对象,最简单的事就是调用 timeit(),它接受一个参数为每个测试中调用被计时语句的次数,默认为一百万次;返回所耗费的秒数。
Timer 对象的另一个主要方法是 repeat(), 它接受两个可选参数。 第一个参数是重复整个测试的次数,第二个参数是每个测试中调用被计时语句的次数。 两个参数都是可选的,它们的默认值分别是 3 和 1000000。 repeat() 方法返回以秒记录的每个测试循环的耗时列表。Python 有一个方便的 min 函数可以把输入的列表返回成最小值,如: min(t.repeat(3, 1000000)).

可以看到,我们可以直接来调用这个模块,而不需要改动函数本身的代码了。

通过使用timeit模块,我做了这个实验:

def calsum(a):    sum = 0    for i in a:        sum += 0    return sumdef test1():    a = range(100000)    b = calsum(a[:])def test2():    a = range(100000)    b = calsum(a)if __name__=='__main__':    from timeit import Timer    t1=Timer("test1()","from __main__ import test1")    t2=Timer("test2()","from __main__ import test2")    print t2.timeit(100)    print t1.timeit(100)    print t1.repeat(3,100)    print t2.repeat(3,100)

结果:

0.8617252285230.912028072744[0.9223898608336298, 0.8713378171269057, 0.8732882160157645][0.7581851754289941, 0.7872209317441641, 0.7674599400640414]

我们可以看到结果却和LeetCode里面的不一样,list比list[:]要快,所以这是我实验有问题还是LeetCode里出现的超时不是因为这个原因?希望有大神能帮助留言解答。

0 0
原创粉丝点击