使用timeit测试函数单次执行时长:多次输出及报错问题求助
问题分析与解决方案
咱们先拆解你遇到的两个问题,再给出正确的实现方式:
1. 为什么"HiTom"会被多次输出?
timeit.timeit()的默认行为是重复执行传入的代码1000000次(默认参数number=1000000),这样做是为了通过多次执行得到更精准的平均耗时。你传入lambda: test()后,它会循环执行test()一百万次,每次test()都会调用callname()打印"HiTom",自然就会看到大量重复输出了。
2. 为什么改写后会抛出ValueError?
你写的timeit.timeit(test(), number=1)犯了一个典型的错误:你直接执行了test()函数,而不是把函数本身作为可调用对象传给timeit。test()执行后返回的是None,timeit拿到的stmt参数变成了None,不符合它要求的“字符串或可调用对象”,于是就抛出了这个错误。
正确实现:测试函数单次执行时长
要实现你的需求,只需要做到两点:
- 传入可调用的函数(或lambda表达式)给
timeit,不要直接执行函数 - 指定
number=1,让timeit只执行一次
修改后的代码如下:
import timeit class UserClass: def callname(self): print("HiTom") if __name__ == '__main__': def test(): user = UserClass() user.callname() # 测试单次执行时长的正确写法 mtime = timeit.timeit(test, number=1) print(f"单次执行时长:{mtime}秒")
你也可以用lambda的写法(效果完全一样):
mtime = timeit.timeit(lambda: test(), number=1)
补充说明:如果只是测试单次执行的耗时,timeit的优势其实不大(单次耗时的波动会比较明显),但如果确实需要单次执行的时长,上面的代码就可以满足你的需求,此时"HiTom"只会被打印一次。
内容的提问来源于stack exchange,提问作者user9673470
相关产品推荐
相关产品推荐

