运行时间检查功能

时间:2018-08-13 20:40:49

标签: python time

我知道我可以使用时间模块来跟踪代码的运行时间:

例如,如果我具有递归的斐波那契功能

def fib_gen_r(i):
    """
    Fibonacci function generator
    generate the fibonacci number at 'i'th posistion
    """
    if i == 0:
        return 0
    elif i == 1:
        return 1
    else:
        return fib_gen_r(i - 1) + fib_gen_r(i - 2)

我可以这样做:

import time
start_time = time.time()
print(fib_gen_r(35))
print(f"--- {time.time() - start_time}s seconds ---\n")
# >>> 
# 9227465
# --- 2.556117296218872s seconds ---

但是,如果我不想每次都写这个,我写了一个函数:

def time_spend(code_to_check):
    import time
    start_time = time.time()
    print(code_to_check)
    print(f"--- {time.time() - start_time}s seconds ---\n")

time_spend(fib_gen_r(35))
# >>>
# check run-time:
# 9227465
# --- 0.0s seconds ---

不知何故,它没有读取运行时,我做错了什么?

谢谢

1 个答案:

答案 0 :(得分:2)

要在调用fib_gen_r之前调用time_spend函数。取而代之的是,您必须将实际函数作为参数传递,而无需调用它,而必须在time_spend内部对其进行调用。

此代码time_spend(fib_gen_r(35))首先调用fib_gen_r,完成后将结果传递给time_spend。不是您想要的,因为您无法衡量已经完成的事情。相反,您想使用这种语法time_spend(fib_gen_r, 35)来传递实际的函数对象作为参数,而无需调用,因此可以在函数内部调用它:

def time_spend(code_to_check, *args, **kwds):
    import time
    start_time = time.time()
    result = code_to_check(*args, **kwds)
    print(f"--- {time.time() - start_time}s seconds ---\n")
    return result


time_spend(fib_gen_r, 35)

一种更简单的选择是使用上下文管理器(with语句):

import contextlib

@contextlib.contextmanager
def time_spend():
    import time
    start_time = time.time()
    yield
    print(f"--- {time.time() - start_time}s seconds ---\n")

然后您可以像这样使用它:

with time_spend():
    fib_gen_r(35)