Python中跨函数使用time.time()计时出现时间差异的问题
关于Python计时差异的问题解答
首先明确:time.time()会统计start到stop之间所有代码的执行时间,包括likelihood内部调用的rosenbrock的全部运行时间,并不是只统计likelihood函数本身的调用开销。
你看到的计时差异,大概率是以下原因导致的:
单次测量的随机性:Linux系统的进程调度、CPU缓存命中情况等因素,会让短时间的单次计时结果波动很大。比如测外部计时时CPU刚好空闲、缓存命中,结果就短;测内部计时时系统有其他任务、缓存未命中,结果就长。解决方法是多次运行取平均,比如循环执行几百次计时逻辑,再计算平均耗时。
计时位置的逻辑差异:检查你把计时移到
rosenbrock内部时的代码——如果是把计时放在了循环内部(比如每次循环都记录时间),那得到的会是循环总耗时(3000次循环的时间总和),这自然比外部单次调用的时间大。如果是把计时放在循环前后,理论上外部计时应该略大于内部计时(多了likelihood的条件判断和函数调用的微小开销),出现相反情况的话,基本就是测量误差导致的。建议用更专业的计时工具:
time.time()适合粗略计时,对于短时间的函数,推荐用Python内置的timeit模块,它会自动多次运行代码并取平均,能有效减少系统波动带来的误差。示例代码如下:
import timeit import numpy as np def likelihood(x, fun): if fun == 0: rosenbrock(x) else: rosenbrock_simplified(x) def rosenbrock(x): logl = 0.0 for i in range(3000): # 示例计算,替换成你的实际逻辑 logl += np.sum(x) ** 2 return logl def time_evaluation(): x = np.random.normal(size=2) # 运行1000次取平均 total_time = timeit.timeit(lambda: likelihood(x, 0), number=1000) return total_time / 1000 # 返回单次运行的平均时间 print(time_evaluation())
内容的提问来源于stack exchange,提问作者Nicolò Molteni
相关产品推荐
相关产品推荐

