求教Python中timeit模块的正确用法

import timeit from timeit

def func(): xxx xxx func()

以前都是用 time.time 测试时间,可以成功测出。现在都说 timeit 测试小片断更方便,就想试试。

print(timeit(func(), number=1))

显示 raise ValueError("stmt is neither a string nor callable")

这个 func 明明可以正常运行的,为什么会无法 callable ?求教正确用法。


求教Python中timeit模块的正确用法

11 回复

fun 是 callable

func() 不是


timeit模块是Python里用来测量小段代码执行时间的标准库,核心就是避免手工计时那些坑。它默认会多次运行代码,给出一个更稳定的平均耗时。

最直接的用法就是在命令行里:

python -m timeit "x = sum(range(1000))"

在代码里用,通常有两种方式。一种是直接用timeit.timeit()函数:

import timeit

# 测量一个表达式执行100万次的时间
time_taken = timeit.timeit('"-".join(str(n) for n in range(100))', number=1000000)
print(time_taken)

另一种,对于多行代码或者需要设置环境的,用timeit.Timer类更合适:

import timeit

# 要测试的代码片段,用三引号包裹
code_to_test = """
my_list = []
for i in range(1000):
    my_list.append(i * 2)
"""

# 设置环境,比如导入模块
setup_code = "import random"

# 创建Timer对象,stmt是要测试的代码,setup是准备工作
timer = timeit.Timer(stmt=code_to_test, setup=setup_code)

# 执行10次,每次运行代码10000遍,返回一个时间列表
times = timer.repeat(repeat=5, number=10000)

# 通常我们看最短的那个时间,受系统环境影响最小
best_time = min(times)
print(f"最佳耗时: {best_time} 秒")

关键就三点:用timeit避免计时误差,复杂的代码用Timer类,结果看min(times)比较准。

总结:用timeit代替手工time.time()

没明白,只是一个函数名而已,就当作叫 abc 好了,abc 怎么就在 timeit 里不能 callable 了?

abc 是 abc() 不是

#2 abc()是 adc 函数的返回值, 不是 callable 的, adc 是函数对象本事, 是 callable 的

楼上说得比较清楚

timeit.timeit(stmt=‘pass’, setup=‘pass’, timer=<default timer>, number=1000000)
创建一个 Timer 实例,参数:
stmt (需要测量的语句或函数),
setup (初始化代码或构建环境的导入语句),
timer (计时函数),
number (每一次测量中语句被执行的次数)
如果在当前文件下测试函数的运行时间,setup:from main import func

他的意思是直接传函数名 func,而不是 func(),后者是函数执行结果。还有你的 import 写反了。

函数对象是可调用的 加上括号就变成了调用函数结果成了返回值了 abc 可调用 abc () 是 abc 函数的返回值 另外 from 在前边 这样看着真难受。。 作为 python 开发 这个格式还是要注意的 。。。

timeit()stmt可以直接接受字符串的表达式, 也可以接受单个变量, 也可以接受函数。
接受函数的话, 你要传函数对象即 func, 你传 func()的话, 要将其设置为字符串表达式, 即"func()"

python<br>import timeit<br><br>def func():<br> a = 'run func'<br><br>if __name__ == '__main__':<br> print(timeit.timeit(stmt=func, number=1)) # 这是传函数对象<br> print(timeit.timeit(stmt='func()', setup="from __main__ import func", number=1)) # 这是传字符串表达式<br>


python<br>def timeit(stmt="pass", setup="pass", timer=default_timer,<br> number=default_number, globals=None):<br> """Convenience function to create Timer object and call timeit method."""<br> return Timer(stmt, setup, timer, globals).timeit(number)<br>

https://vonsdite.cn/posts/6218c1b6.html 有例子,有说明

感谢以上各位回复者,确实是这个问题,受教了。

回到顶部