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,有时它有点多余。它是怎么“多余”的?