Python 3.x 函数的处理时间(timit、time)存在巨大差异
出于一些教学目的,我想测量一些函数的计时(比所示函数稍微复杂一些),并在后面讨论大O缩放行为。但我对生成的数字的可靠性存在问题: 我的代码:Python 3.x 函数的处理时间(timit、time)存在巨大差异,python-3.x,function,time,Python 3.x,Function,Time,出于一些教学目的,我想测量一些函数的计时(比所示函数稍微复杂一些),并在后面讨论大O缩放行为。但我对生成的数字的可靠性存在问题: 我的代码: import time import numpy as np def run_time(fun, runs): times = [] for i in range(runs): t0 = time.clock() fun() t1 = time.clock() - t0 t
import time
import numpy as np
def run_time(fun, runs):
times = []
for i in range(runs):
t0 = time.clock()
fun()
t1 = time.clock() - t0
times.append(t1)
return np.mean(times), np.std(times)#, times
def fact0(n):
product = 1
for i in range(n):
product = product * (i+1)
return product
def fact1(n):
if n == 0:
return 1
else:
return n * fact1(n-1)
print(run_time(lambda: fact0(500), 100000))
print(run_time(lambda: fact1(500), 100000))
我通常会得到这样的结果:
(0.000186065330000082, 5.08689027009196e-05)
(0.0002853808799999845, 8.285739309454826e-05)
因此std大于平均值。那对我来说太可怕了。此外,由于没有递归,我希望fact0()比fact1()快得多
如果我现在使用timeit:
import timeit
mysetup = ""
mycode = '''
def fact1(n):
if n == 0:
return 1
else:
return n * fact1(n-1)
fact1(500)
'''
print(timeit.timeit(setup = mysetup, stmt = mycode, number = 100000)/100000)
我要买一份差不多一份的magnt。平均值较小:
在以下讨论的更正之后,它是:
0.00028513264190871266
这与运行时间
版本非常一致
所以我的问题是,我该如何恰当地利用时间?为什么我的两种获取时间的方法之间存在巨大差异?有什么建议吗?我希望坚持使用“time.clock()”,我不想使用(同样出于教学原因)cProfile或更复杂的模块
我很感谢你的评论
(由于@Carcigenicate的评论而编辑)您从未在
mycode
中调用该函数,因此您只需要计算定义该函数所需的时间(我预计会很快)
您需要调用以下函数:
import timeit
mycode = '''
def fact1(n):
if n == 0:
return 1
else:
return n * fact1(n-1)
fact1(100000)
'''
print(timeit.timeit(stmt=mycode, number=100000) / 100000)
def fact1(n):
if n == 0:
return 1
else:
return n * fact1(n-1)
print(timeit.timeit(lambda: fact1(100000), number=100000) / 100000)
但实际上,这是次优的,因为您将定义包含在计时中。我会将其更改为只传递一个函数:
import timeit
mycode = '''
def fact1(n):
if n == 0:
return 1
else:
return n * fact1(n-1)
fact1(100000)
'''
print(timeit.timeit(stmt=mycode, number=100000) / 100000)
def fact1(n):
if n == 0:
return 1
else:
return n * fact1(n-1)
print(timeit.timeit(lambda: fact1(100000), number=100000) / 100000)
打字错误你从来没有在
运行时间中调用fun
。不是吗?在t0=time.clock()和t1=time.clock()-t0之间的运行时间的第5行。这不对吗?不过,该函数已执行。您需要fun()
。只是fun
不调用它。请稍候,在将函数交给run\u time
之前,您正在调用该函数一次。您需要传递函数本身,比如run\u time(fact0,10000)
。现在,run\u time
什么也不做100000次。不过,您需要将其包装在lambda或其他东西中以提供参数。类似于run\u time(lambda:fact0(50010000)
。修复这两个问题,然后重试。您从未在mycode
中调用函数。您只是在计时定义函数所需的时间。