分析 numba 包装函数的覆盖率

Posted

技术标签:

【中文标题】分析 numba 包装函数的覆盖率【英文标题】:Analyzing coverage of numba-wrapped functions 【发布时间】:2015-01-08 14:38:02 【问题描述】:

我写了a python module,其中大部分都包裹在@numba.jit 装饰器中以提高速度。我还为这个模块编写了很多测试,我用py.test 运行(on Travis-CI)。现在,我正在尝试使用pytest-cov 查看这些测试的覆盖率,这只是一个依赖于coverage 的插件(希望将所有这些都集成到coveralls)。

不幸的是,似乎在所有这些函数上使用numba.jit 会使coverage 认为这些函数从未被使用过——确实是这样。所以我的测试基本上没有报告覆盖率。这并不令人意外,因为numba 正在获取该代码并对其进行编译,因此代码本身实际上从未被使用过。但我希望有时你会在 python 中看到一些魔力......

有没有什么有用的方法可以结合这两个优秀的工具?如果做不到这一点,是否有任何其他工具可以用来测量 numba 的覆盖率?

[我制作了一个最小的工作示例来显示here 的区别。)

【问题讨论】:

【参考方案1】:

最好的办法是在覆盖测量期间禁用 numba JIT。这依赖于你信任 Python 代码和 JIT 代码之间的对应关系,但无论如何你需要在某种程度上信任它。

【讨论】:

是的,我担心会是这样。不幸的是,即使使用 numba,我的测试也需要大约 15 分钟,而且我估计如果没有它,它们将需要大约一天的时间,所以禁用 numba 对我不起作用。而且我看不出有任何方法可以在不减少覆盖范围的情况下减少他们所花费的时间。无论如何,感谢您的回答和一段非常好的代码! :) 具体来说,您可以通过将 NUMBA_DISABLE_JIT 环境变量设置为非零值来禁用 jit。 这行得通,但它改变了函数的行为。某些操作在 numpy 数组上有效,但在 numba 数组上无效,反之亦然,因此单元测试将无法捕获禁用 numba 的某些故障。 您将如何在覆盖率测量期间禁用 numba JIT @Ned?我目前在我的 pyproject.toml 文件中指定了几个覆盖选项,并且正在努力弄清楚如何仅为覆盖测量禁用 JIT。 您将在运行覆盖率测量时定义 NUMBA_DISABLE_JIT 环境变量。 Coverage.py 没有为您执行此操作的功能。【参考方案2】:

这并不是说这回答了问题,但我认为我应该宣传另一种可能有人感兴趣的工作方式。使用llvm-cov 可以完成一些非常漂亮的事情。据推测,这必须在 numba 中实现,并且必须对 llvm 代码进行检测,这将需要某处的一些标志。但是既然 numba 知道 python 代码行和 llvm 代码之间的对应关系,那么肯定有比我更聪明的人可以实现的东西。

【讨论】:

以上是关于分析 numba 包装函数的覆盖率的主要内容,如果未能解决你的问题,请参考以下文章

覆盖require函数

代码测试覆盖率---分析

覆盖静态类函数的默认 SWIG 名称

在Java中,如果返回类型分别是原始类型及其包装类,是不是可以覆盖方法?

覆盖 JSP servlet(过滤器“*.jsp”)以包装身份验证模型

全角 vimeo 包装背景