【问题标题】:Can I compile numba in the setup phase of a unit test?我可以在单元测试的设置阶段编译 numba 吗?
【发布时间】:2014-02-17 15:45:28
【问题描述】:

我使用 numba 使用 autojit 装饰器来加速我的部分 Python 代码。测试通过,%timeit 显示代码确实加速了。

第一次执行很慢,因为我认为 numba 正在编译代码。说得通。但是,当我运行一套测试时,它们非常运行得很慢,从我更改前大约 10 秒内的 10 次测试到 117 秒内的相同测试。似乎 numba 必须一次又一次地为每个测试单独编译。

我可以避免这种情况吗?我尝试在 setUp 函数中运行一个简单的测试,认为可能会为所有测试编译一次该函数,但这并没有显着改变运行时间。

【问题讨论】:

  • 似乎缓存 numba 编译将是最好的解决方案(但尚未实现)。我能想到的最好的事情就是制作一个自定义装饰器,在单元测试期间关闭 numba。
  • 您是否知道暂时关闭 numba 的推荐解决方案?

标签: python nose python-unittest numba autojit


【解决方案1】:

这样的事情可能会奏效:

from numba import autojit

def autojit_except_when_unit_testing(func):
    if UNIT_TESTING:
        return func
    return autojit(func)

可能还会遇到 numba 的缓存问题,因为这是一个非常重要的用例。我通常会很犹豫在这样不同的环境中运行单元测试和生产代码,但是需要永远运行的单元测试不会经常运行。您几乎可以肯定也应该使用 numba 进行测试,只是频率要低一些。

【讨论】:

  • 当然。我想我会同时运行两者,并希望尽快缓存。谢谢!附言这是caching feature request issue。
  • 这听起来是个坏主意。你想测试你的函数在 autojitted 时是否正常工作。
  • @asmeurer 这是一个权衡。如果测试运行得很快,他会更频繁地运行它们。但你是对的,他绝对应该定期运行真实的东西。
  • 但是你必须明白 autojit 可能会改变程序的语义(特别是如果 numba 中存在错误)。所以对于测试,你真的需要测试代码实际上会做什么。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2014-11-14
  • 2013-07-31
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
相关资源
最近更新 更多