Python 运行时检查功能

Python 运行时检查功能,python,time,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: ret

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

例如,如果我有一个带递归的斐波那契函数

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 ---
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)
不知何故,这不是阅读运行时,我做错了什么


谢谢,

在调用
花费的时间之前,您正在调用您的
fib\u gen\r
函数。相反,您必须将实际函数作为参数传递,而不调用它,并在
时间内调用它

此代码
time\u-spend(fib\u-gen\u-r(35))
首先调用
fib\u-gen\u-r
,完成后,将结果传递到
time\u-spend
。不是你想要的,因为你无法衡量已经完成的事情。相反,您希望使用此语法
time\u-spend(fib\u-gen\r,35)
将实际的函数对象作为参数传递,而不调用它,因此可以在函数内部调用它:

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 ---
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 time_spend():
    fib_gen_r(35)

等等,我确实运行了代码来检查,因为它实际上需要时间来计算,甚至打印它out@Code_Control_jxie0755哦,我明白了,编辑了答案,我明白了!!!我确实是在_花费的时间之前调用它的,这就是为什么它需要时间来执行,但那是在整个_花费()运行之前。使用您的方法,我强制fib函数在开始计时后运行,谢谢!“我知道我可以使用时间模块来跟踪代码的运行时间”嗯,你可以,但你不应该。
时间
模块不用于基准测试或分析代码;分别使用
timeit
profile
。他们会处理所有你想不到的事情,或者编写多次运行测试并进行适当平均是一件痛苦的事情,为平台使用正确的时钟,禁用GC循环检测器之类的后台任务,不将设置代码作为计时的一部分,等等。我也知道timeit,有时它有点多余。它是怎么“多余”的?