【问题标题】:Decorator function is not working as expected装饰器功能未按预期工作
【发布时间】:2021-04-18 03:45:58
【问题描述】:

我正在对导入进行一些测试,我想测试使用函数装饰器导入某些包的速度。这是我的代码:

import time


def timeit(func):
    def wrapper():
        start = time.time()
        func()
        end = time.time()
        print(f'{func.__name__} executed in {end - start} second(s)')
    return wrapper


@timeit
def import_matplotlib():
    import matplotlib.pyplot


@timeit
def import_numpy():
    import numpy


import_matplotlib()
import_numpy()

输出

import_matplotlib executed in 0.4385249614715576 second(s)
import_numpy executed in 0.0 second(s)

这不是预期的输出,因为 numpy 不是立即导入的。这里发生了什么,如何解决?谢谢。

编辑

如果我对 import_numpy() 进行此更改:

@timeit
def import_numpy():
    import numpy
    time.sleep(2)

输出变成这样:

import_matplotlib executed in 0.4556155204772949 second(s)
import_numpy executed in 2.0041260719299316 second(s)

这告诉我我的装饰器函数没有任何问题。为什么会出现这种行为?

【问题讨论】:

  • 您的(初始)代码在我的机器上运行良好:import_numpy executed in 1.1920928955078125e-06 second(s)。但是,是的,导入 numpy 很快。

标签: python-decorators


【解决方案1】:

尝试使用timeit module?它是为此目的而构建的,并使代码更简单。

>>> import timeit
>>> timeit.timeit(stmt='import numpy')
0.13844075199995132

【讨论】:

  • 我没有意识到 numpy 只是导入这么快。我知道 timeit 模块,但我只是为了学习目的而这样做。我以前从未与装饰师合作过。但你的回答提出了一个大问题。为什么使用timeit模块的值​​比我的代码生成的值大很多?
猜你喜欢
  • 2013-08-29
  • 2020-04-28
  • 2021-08-27
  • 1970-01-01
  • 2012-10-07
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多