You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:51:40