【问题标题】:Is `built-in method numpy.core._multiarray_umath.implement_array_function` a performance bottleneck?`built-in method numpy.core._multiarray_umath.implement_array_function` 是性能瓶颈吗?
【发布时间】:2020-09-10 23:13:25
【问题描述】:

我在一些模拟中使用numpy v1.18.2,并使用np.uniquenp.diffnp.interp 等内置函数。我在标准对象上使用这些函数,即列表或 numpy 数组。

当我检查cProfile 时,我看到这些函数调用了一个内置方法numpy.core._multiarray_umath.implement_array_function,并且这个方法占了我运行时的32.5%!据我了解,这是一个包装器,它执行一些检查以确保传递给函数的参数与函数兼容。

我有两个问题:

  1. 这个函数 (implement_array_function) 真的占用了这么多时间,还是我正在执行的操作 (np.unique, np.diff, np.interp) 占用了所有这些时间?也就是说,我是否误解了 cProfile 输出?我对snakeviz 的分层输出感到困惑。请参阅snakeviz output here 和函数here 的详细信息。
  2. 有什么方法可以禁用/绕过它,因为每次都不需要检查输入,因为我传递给这些 numpy 函数的参数已经在我的代码中进行了控制?我希望这会给我带来性能提升。

我已经看到了这个问题 (what is numpy.core._multiarray_umath.implement_array_function and why it costs lots of time?),但我无法理解这个函数到底是什么或做什么。我也尝试了解NEP 18,但无法弄清楚如何准确解决问题。请补充我的知识空白并纠正任何误解。 如果有人能像我 5 岁一样向我解释这一点(r/explainlikeimfive/),而不是假设开发人员级别的 Python 知识,我也将不胜感激。

【问题讨论】:

  • 有什么要解决的? NEP18 讨论性能。它估计这个调度程序每次调用会增加 1(可能是 2)微秒。这不会使您的总时间增加 800 秒。通过它的功能会占用该时间(累积)。您无法更改此行为(除非可以通过恢复到更早版本的 numpy
  • 啊,我想和我想的一样,实际上占了大部分时间的是原来的功能。我对snakeviz 的情节感到困惑,因为看起来调度员占用了额外的时间。抱歉,但这本身并不完全有什么要解决的,但我需要一些指导,因为我不确定我的理解是否正确。 NEP18 对我来说也有点混乱和技术性。
  • 我也意识到我也应该从snakeviz 输出中发布该统计数据表。我已将其添加到question。就像你说的 tottime 更小(~73 秒),它的 cumtime 加起来约为 800 秒。但是,我的代码确实有数百万到十亿次调用,并且总时间确实达到了大约一分钟。如果可以禁用此行为而不必恢复到早期版本,那就太好了。所以希望你明白我正在寻找一些这些答案和一些保证,因为我的知识还不够。

标签: python python-3.x numpy scipy snakeviz


【解决方案1】:

以下所有信息均来自NEP 18

这个函数 (implement_array_function) 真的占用了这么多时间,还是我正在做的操作 (np.unique, np.diff, np.interp) 实际上占用了所有这些时间?

正如@hpaulj 在评论中正确提到的那样,调度程序的开销为每个 numpy 函数调用增加了 2-3 微秒。一旦在 C 中实现,这可能会缩短到 0.5-1 微秒。参见here

有什么办法可以禁用/绕过它

是的,从 NumPy 1.17 开始,您可以将环境变量 NUMPY_EXPERIMENTAL_ARRAY_FUNCTION 设置为 0(在导入 numpy 之前),这将禁用 implement_array_function(参见 here)。类似的东西

import os
os.environ['NUMPY_EXPERIMENTAL_ARRAY_FUNCTION'] = '0'
import numpy as np

但是,禁用它可能不会给您带来任何显着的性能提升,因为它的开销只有几微秒,这也是以后 numpy 版本中的默认设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2016-06-12
    • 2015-07-27
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多