Python 3.x 函数的处理时间(timit、time)存在巨大差异

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

出于一些教学目的,我想测量一些函数的计时(比所示函数稍微复杂一些),并在后面讨论大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
        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
中调用函数。您只是在计时定义函数所需的时间。