首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Timeit.timeit法哪个方向是正确的:内部还是外部?

Timeit.timeit法哪个方向是正确的:内部还是外部?
EN

Stack Overflow用户
提问于 2021-03-26 14:27:38
回答 1查看 41关注 0票数 0

我想检查每个函数的速度,但遇到了一个问题。如您所见,下面的代码包含两个相同的函数:func和func2。然而,函数是直接在timeit.timeit方法中声明的。测试后,我得到了一个结果:Func result: 0.08, func 2 result: 0.21.。这是一个巨大的不同。

这里有一个问题:为什么相同的函数有不同的速度?现在是从全局范围获取func2所需的时间吗?

代码语言:javascript
复制
import timeit


def func2() -> range:
    return range(1024)


def main():
    """
    Number of seconds for each function to perform with 500k executions
    """
    func_res = round(timeit.timeit(
        'def func() -> range: return range(1024); func()',
        number=500_000
        ),
    2)
    func2_res = round(timeit.timeit(
        'func2()',
        number=500_000,
        globals=globals()
        ),
    2)
    return f'Func result: {func_res}, func 2 result: {func2_res}.'

if __name__ == '__main__':
    print(main())

P.S. 'def func() ->范围:返回范围(1024)‘- 'def func() ->范围:返回范围(1024);func()’编辑了.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-26 14:30:15

您正在测试的两个语句是完全不同的。

第一个(def func() -> range: return range(1024); func())只测试Python在用body return range(1024); func()声明函数时有多快。第二个调用函数。

因为timeit也可以接受一个可调用的,所以您可以只做

代码语言:javascript
复制
timeit.timeit(
    func2,
    number=500_000,
)

不管怎么说。

让我们尝试使用一个更好的测试平台:

代码语言:javascript
复制
import timeit


def func2() -> range:
    return range(1024)


def t(name, stmt, setup="pass"):
    res = timeit.timeit(stmt, setup, number=5_000_000, globals=globals()) * 1000
    print(f"{name:>25} {int(res):5d}")


def main():
    t("declare a func", "def func() -> range: return range(1024); func()")
    t("declare & run func", "def func() -> range: return range(1024)\nfunc()")
    t("run local func", "func()", "def func() -> range: return range(1024)")
    t("run global func2 by name", "func2()")
    t("run func2 by ref", func2)


if __name__ == "__main__":
    main()

您可以看到声明func并调用它的选项要慢得多(我的机器上的数字YMMV):

代码语言:javascript
复制
           declare a func   547  # <-- doesn't call range!
       declare & run func  1282  # <-- slow...
           run local func   854  # <-- declare function once & call it
 run global func2 by name   836
         run func2 by ref   774
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66818825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档