【发布时间】:2020-09-10 23:13:25
【问题描述】:
我在一些模拟中使用numpy v1.18.2,并使用np.unique、np.diff 和np.interp 等内置函数。我在标准对象上使用这些函数,即列表或 numpy 数组。
当我检查cProfile 时,我看到这些函数调用了一个内置方法numpy.core._multiarray_umath.implement_array_function,并且这个方法占了我运行时的32.5%!据我了解,这是一个包装器,它执行一些检查以确保传递给函数的参数与函数兼容。
我有两个问题:
- 这个函数 (
implement_array_function) 真的占用了这么多时间,还是我正在执行的操作 (np.unique,np.diff,np.interp) 占用了所有这些时间?也就是说,我是否误解了 cProfile 输出?我对snakeviz 的分层输出感到困惑。请参阅snakeviz output here 和函数here 的详细信息。 - 有什么方法可以禁用/绕过它,因为每次都不需要检查输入,因为我传递给这些 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