泛型函数生成器的计算时间

问题描述 投票:0回答:1

尝试计算使用生成器的任何函数的每个收益所花费的时间,但我找不到任何方法来做到这一点。 我得到的最接近的是创建一个像这样的包装器:

def catchtime_wrapper_for_method(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return_val = func(*args, **kwargs)
        if isinstance(return_val, types.GeneratorType):
            for g in return_val:
                start_time = perf_counter()
                yield g
                end_time = perf_counter()
                print(f"Iteration time: {end_time - start_time:.6f} seconds")
        else:
            return return_val
    return wrapper

然后这样称呼:

for i in catchtime_wrapper_for_method(my_gen_function)(args...):
   # doing something with i here

my_gen_function
产生一些 io + io 计算的结果。 它具有 tqdm,已被证明是准确的,并且每次迭代打印约 5 秒。

但是

catchtime_wrapper_for_method
打印〜1秒,我假设〜1秒是运行
catchtime_wrapper_for_method
的时间,没有
my_gen_function
部分......所以我想6秒应该是准确的结果,但我需要它由
打印catchtime_wrapper_for_method
而不是 tqdm。 我需要
my_gen_function
继续像往常一样工作,所以它仍然需要是一个生成器。

也尝试过:(欢迎你也尝试,我可能会犯一些错误)

  • 产量
  • 装饰器
  • 使用
  • __enter__
    __exit__
  • catchtime 类
  • 使用 next()

有什么建议说明为什么会发生这种情况吗?

谢谢:)

python python-3.x generator metaprogramming
1个回答
0
投票

似乎出现差异是因为

tqdm
正在测量每次迭代的时间(包括生成器函数本身内的任何开销或处理),而
wrapper function
仅测量在包装器函数中花费的时间,而不是生成器函数中花费的时间。

尝试这样的事情:

def catchtime_wrapper_for_method(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        generator = func(*args, **kwargs)
        while True:
            try:
                start_time = perf_counter()
                result = next(generator)
                end_time = perf_counter()
                print(f"Iteration time: {end_time - start_time:.6f} seconds")
                yield result
            except StopIteration:
                break

    return wrapper
© www.soinside.com 2019 - 2024. All rights reserved.