如何在 python 中使用 numba.jit 将计算值传递到列表排序?

2024-03-16

我正在尝试使用 Python 中的 numba-jit 函数中的自定义键对列表进行排序。简单的自定义键可以工作,例如我知道我可以使用如下所示的绝对值进行排序:

import numba

@numba.jit(nopython=True)
def myfunc():
    mylist = [-4, 6, 2, 0, -1]
    mylist.sort(key=lambda x: abs(x))
    return mylist  # [0, -1, 2, -4, 6]

但是,在下面更复杂的示例中,我收到一个我不理解的错误。

import numba
import numpy as np


@numba.jit(nopython=True)
def dist_from_mean(val, mu):
    return abs(val - mu)

@numba.jit(nopython=True)
def func():
    l = [1,7,3,9,10,-4,-2,0]
    avg_val = np.array(l).mean()
    l.sort(key=lambda x: dist_from_mean(x, mu=avg_val))
    return l

它报告的错误如下:

Traceback (most recent call last):
  File "testitout.py", line 18, in <module>
    ret = func()
  File "/.../python3.6/site-packages/numba/core/dispatcher.py", line 415, in _compile_for_args
    error_rewrite(e, 'typing')
  File "/.../python3.6/site-packages/numba/core/dispatcher.py", line 358, in error_rewrite
    reraise(type(e), e, None)
  File "/.../python3.6/site-packages/numba/core/utils.py", line 80, in reraise
    raise value.with_traceback(tb)
numba.core.errors.TypingError: Failed in nopython mode pipeline (step: convert make_function into JIT functions)
Cannot capture the non-constant value associated with variable 'avg_val' in a function that will escape.

File "testitout.py", line 14:
def func():
    <source elided>
    l.sort(key=lambda x: dist_from_mean(x, mu=avg_val))
                                                ^

你知道这里发生了什么吗?


你知道这里发生了什么吗?

通过使用参数nopython = True您停用对象模式,因此 Numba 无法将所有值作为 Python 对象处理(请参阅:https://numba.pydata.org/numba-doc/latest/glossary.html#term-object-mode https://numba.pydata.org/numba-doc/latest/glossary.html#term-object-mode)。 (参考其实是我今天偶然写的另一篇文章:如何在 numba 中调用 `@guvectorize` 内的 `@guvectorize`? https://stackoverflow.com/questions/65353407/how-call-a-guvectorize-inside-a-guvectorize-in-numba/65426862#65426862)

@numba.jit(nopython=True)
def func():
    l = [1,7,3,9,10,-4,-2,0]
    avg_val = np.array(l).mean()
    l.sort(key=lambda x: dist_from_mean(x, mu=avg_val))
    return l

Anyhow, lambda对于 numba jit 函数来说“太”复杂了 - 至少当它作为参数传递时(比较https://github.com/numba/numba/issues/4481 https://github.com/numba/numba/issues/4481)。随着nopython激活模式后,您只能使用有限数量的库 - 完整列表可以在此处找到:https://numba.pydata.org/numba-doc/dev/reference/numpysupported.html https://numba.pydata.org/numba-doc/dev/reference/numpysupported.html

这就是为什么它会抛出以下错误:

numba.core.errors.TypingError:在 nopython 模式管道中失败(步骤: 将 make_function 转换为 JIT 函数)无法捕获 与函数中变量“avg_val”关联的非常量值 那将会逃脱。

此外,您在另一个函数中引用 jit 加速函数 - 当有nopython = True。这也可能是问题的根源。

我强烈建议您查看以下教程:http://numba.pydata.org/numba-doc/latest/user/5minguide.html#will-numba-work-for-my-code; http://numba.pydata.org/numba-doc/latest/user/5minguide.html#will-numba-work-for-my-code;它应该可以帮助您解决类似的问题!


进一步阅读和来源:

  • https://github.com/numba/numba/issues/5120 https://github.com/numba/numba/issues/5120
  • http://numba.pydata.org/numba-doc/latest/user/5minguide.html#will-numba-work-for-my-code http://numba.pydata.org/numba-doc/latest/user/5minguide.html#will-numba-work-for-my-code
  • TypingError:在 nopython 模式管道中失败(步骤:nopython 前端) https://stackoverflow.com/questions/55065419/typingerror-failed-in-nopython-mode-pipeline-step-nopython-frontend
  • https://github.com/numba/numba/issues/4481 https://github.com/numba/numba/issues/4481
  • https://numba.pydata.org/numba-doc/dev/reference/numpysupported.html https://numba.pydata.org/numba-doc/dev/reference/numpysupported.html
  • 如何在 numba 中调用 `@guvectorize` 内的 `@guvectorize`? https://stackoverflow.com/questions/65353407/how-call-a-guvectorize-inside-a-guvectorize-in-numba/65426862#65426862
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 python 中使用 numba.jit 将计算值传递到列表排序? 的相关文章

随机推荐

  • 更改 SweetAlert 上的图标图像大小

    我正在尝试更改 SweetAlert 上的图标图像大小 在 css 文件中我看到 sweet alert sa icon width 80px height 80px border 4px solid gray webkit border
  • 从 R Studio 中的 mclapply 打印

    我在 RStudio 中使用 mclapply 并希望从每个进程向控制台输出 但这似乎以某种方式被抑制 例如这里提到的 mclapply 是否保证按顺序返回其结果 https stackoverflow com questions 1469
  • 避免派生类 C++ 中的“纯虚函数调用”

    我对 C 相当陌生 所以如果这个问题的水平稍微低于这里的通常标准 我想道歉 我试图让几个类从具有虚拟函数定义的基类继承 然后我想创建一个 MainClass 数组 它可以包含所有派生类 以便输出派生 定义的虚拟功能 我收到错误 R6025
  • 检测 stdout 是否重定向到管道(而不是文件、字符设备、终端或套接字)?

    理想情况下 这可以在 shell 中编写脚本 但 Perl 或 Python 也可以 C 代码可能会有帮助 但可能不符合成本 效益 我认识到重定向到 FIFO 命名管道 可能与真实管道无法区分 这已经是我并不真正关心的边缘情况了 严格的 P
  • brew 安装 libusb 链接失败

    我正在安装libusb with brew在我的 Mac 中 酿造安装libusb 链接步骤失败 如下所示 Error The brew link step did not complete successfully The formula
  • API 级别低于 9 的 android:filterTouchesWhenObscured 的类似物

    从 API 级别 9 开始 有android filterTouchesWhenObscured属性及对应setFilterTouchesWhenObscured方法上ViewGroup 例如 当视图有onClickListener设置并且
  • 从 XMLHttpRequest 中删除 HTTP 标头

    我正在开发一个 ajax 长轮询类型应用程序 我想最大限度地减少我使用的带宽量 目前最大的成本之一是客户端 HTTP 标头 一旦我建立了连接并在客户端上存储了会话 ID 我真的不想再浪费任何带宽来传输冗余的 http 信息 例如浏览器类型
  • 使用Java根据数据库中的最大ID生成下一个ID

    我正在开发一个网络应用程序 它将有多个用户 我使用mysql作为数据库 在我的应用程序中 我正在获取最新的id from the database using max id 然后为新注册生成下一个 id 这种方法是不正确的 因为 id 可能
  • Groupby 与 min 结合,同时保留整个数据帧[重复]

    这个问题在这里已经有答案了 我想结合 groupby 和 min 但保留整个数据框 如果我使用下面的方法 我最终只会得到 2 列 即 col1 和 col2 对于这个 df col1 col2 col3 1 1 A 1 0 B 2 2 C
  • 导入 BitTorrent Bencode 模块

    我使用的是 Mac OS X 10 6 Python 是 2 6 1 我已经安装了 Bencode 模块 sudo easy install BitTorrent bencode 它出现在站点包中 Library Python 2 6 si
  • 如何有效地将体素空间聚类成尽可能少的相似、连续的块?

    我正在研究使用体素来表示大型 256x256x256 体素 战场以及服务器托管的多人游戏的可破坏地形的可行性 任何游戏一次只存在一个战场 然而 为了能够广播房间及其地形的变化 我试图找到一种算法 可以将体素分组为尽可能少的矩形块 举一个简单
  • 拖动 UITableView

    我正在开发一个 iPhone 应用程序 我想将表格视图 而不是单元格 拖动到屏幕中的某个点 我的桌面视图位于屏幕的下半部分 图像位于屏幕的上半部分 当我滚动表格查看下面的行时 表格实际上应该向上移动到图像上方 y pos 减小 高度会增加
  • 如何编写一个仅解析标签之间具有特定文本的对象的 BeautifulSoup 过滤器?

    我正在使用 Django 和 Python 3 7 我想要更有效的解析 所以我正在阅读有关 SoupStrainer 对象的内容 我创建了一个自定义的来帮助我仅解析我需要的元素 def my custom strainer self ele
  • 网站单元测试

    我很好奇其他开发人员如何测试他们的网站 PHP 特别是在我的例子中 但这可能跨越多种语言 我已经在一个网站上工作了一年多了 我真的很想自动化我在版本之间所做的大量回归测试 这个特定站点位于 CodeIgniter 中 因此我对我的模型进行了
  • 当类未实现 IEnumerable 时,GetEnumerator 方法是否仍应具有幂等性

    这个问题是另一个问题的基础question https stackoverflow com questions 4189581 should an ienumerable iterator on a queue dequeue an ite
  • 带 onClick 的按钮在 React 中只能工作一次

    我需要在 React 应用程序中制作折叠菜单 但带有 onClick 的按钮只能工作一次 我创建了一个布尔变量 当我点击按钮时它应该会改变 但我只能点击按钮一次 此后 a 不起作用 它处于非活动状态 let isOpened false c
  • 将指针容器转换为智能指针?

    有没有一种简洁 通用的方法来转换std容器 例如vector 常规 哑指针 vector lt T gt 例如 boost shared ptr vector lt boost shared ptr
  • 清除向量或定义新向量,哪个更快

    哪种方法更快并且开销更少 方法一 void foo std vector lt int gt aVector for int i 0 i lt 1000000 i aVector clear aVector push back i 方法二
  • 使用iOS SDK在运行时创建plist?

    我是 iPhone 开发新手 我想知道是否有任何示例 Objective C 代码可以通过从网络服务器获取数据来在运行时创建 plist 并且我想知道数据的格式应该是什么 以便我可以在运行时轻松创建 plist 非常简单NS词典 http
  • 如何在 python 中使用 numba.jit 将计算值传递到列表排序?

    我正在尝试使用 Python 中的 numba jit 函数中的自定义键对列表进行排序 简单的自定义键可以工作 例如我知道我可以使用如下所示的绝对值进行排序 import numba numba jit nopython True def