Python中timeit和time的区别

5

以下两种方式之间是否有明显区别:

from time import time
start = time()
# some process
print time() - start

并且:

from timeit import timeit
def my_funct():
    # some process
print timeit(my_funct, number=1)

例如,我将使用欧拉计划1题作为示例(因为它非常容易理解/解决)。
def pE1test1(): # using time()
    from time import time
    start = time()
    print sum([n for n in range(1, 1000) if n%3==0 or n%5==0])
    print time() - start

def pE1test2(): # using timeit
    print sum([n for n in range(1, 1000) if n%3==0 or n%5==0])

from timeit import timeit
pE1test1()
print timeit(pE1test2, number=1)

这将输出:
>>> 
233168
0.0090000629425
233168
0.00513921300363
< p > timeit 和 time 之间的主要区别是什么?< /p >
2个回答

7

timeit会在您的系统上使用最佳的计时函数。请参阅timeit.default_timer上的文档。

此外,timeit关闭垃圾回收器

此外,我认为您使用了错误的timeit。您应该按照文档中最后一个示例传递一个字符串。

print timeit("pE1test2()","from __main__ import PE1test2",number=1)

当然,另一个主要区别是,timeit 让函数在成千上万次迭代中的执行时间变得微不足道(这是唯一有意义的计时结果的情况)。这减少了单次运行长于其他运行的重要性(例如,由于其他程序占用了您的系统资源)。

顺便说一下,您可能不应该传递number=1。较高的数字通常会提供更好的结果,因为它们会分摊运行时差异性(上下文切换,非相关进程占用资源,C级别发生的奇怪事情,某个库命中必须复制大量数组的操作等)。 - user395760
@delnan -- 是的,当然是这样 -- 我以前从未见过有人尝试在没有重复的情况下计时函数的执行。我只是试图在OP所请求的上下文中解释timeittime之间的区别。 - mgilson
是的,我并不是在抱怨你的回答(实际上很好),而是给提问者一些思考的食粮。 - user395760

0

这两个模块的目的非常不同。

time模块提供了对底层系统提供的各种时间/日期函数的低级访问。

timeit模块专门用于运行性能测试。

正如您所指出的,您可以使用time中的函数进行简单的计时,但是在尝试进行性能测试时,人们会遇到许多常见的陷阱。 timeit试图减轻这些问题,以获得可重复比较的数字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接