【问题标题】:Numba giving error for NumPynumba 给出 NumPy 的错误
【发布时间】:2018-06-26 22:49:47
【问题描述】:

看了一个SciPy talk on Numba之后,我的理解是,如果用NumPy工具做的话,用Numba也可以做(很有可能加快速度)。

但是,当我尝试使用 Numba-fying 一些代码时,看起来简单的 JIT (1) 在列表理解方面没有问题,但 (2) 无法生成 numpy.asarray() 的头部或尾部。

当我跑步时

import numba
@numba.jit
def squareTest(xlist):
    y = [x**2 for x in xlist]
    return y

它运行良好。但是当我跑步时

import numba
import numpy as np
@numba.jit
def squareTest(xlist):
    y = [x**2 for x in xlist]
    y1 = np.asarray(y)
    return y1

IPython 控制台给了我一个很长的回溯,说有一个降低错误,并以

结尾
def squareTest(xlist):
    y = [x**2 for x in xlist]`  
    ^

我不知道 Numba 模块的结构,但最后一部分告诉我,当它将生成的列表转换为 NumPy 数组时,它在进行列表推导时遇到了麻烦。

我检查过

@numba.jit
def squareTest(xlist):
    y = list(range(20))
    y1 = np.asarray(y)
    return y1

它运行没有问题,所以它看起来可以处理任一列表理解np.asarray(),但不能同时处理两者。

我的第一个猜测是 njit 模式可以处理 NumPy 的所有内容,而通过将 n 添加到 jit 来关闭的模式是处理列表理解的。但是不行,第一个代码示例在更改为 njit 后仍然有效。

这里有什么问题,我怎样才能 Numba-fy 涉及对数组执行 NumPy 数组操作的函数?

【问题讨论】:

  • 励志演讲者很棒,但如果您想了解一些实际知识,请从 numpy+numba questions 开始,它会显示什么有效以及何时有效。大纲:如果您的任务有 NumPy 解决方案,请使用它;让 Numba 方便地进行 NumPy 无法矢量化的迭代计算。
  • @user6655984 是的,这个特定的事情可以通过矢量化做得更好,但我将它用作我想尝试@jit 的其他东西的微型版本。所以这与其说是优化代码,不如说是让它工作。

标签: python python-3.x numpy list-comprehension numba


【解决方案1】:

Numba 有时可能能够处理列表推导,但是您链接的“Numba - 告诉那些 C++ 恶霸迷路”演讲中的演讲者指出,要使其发挥潜力,您需要编写代码你以非 Python 的方式 JIT。

Numba JIT 代码时很有可能会改变操作的顺序,甚至组合操作,这样即使它可以对一个列表做一个列表推导,也可以把一个列表变成一个NumPy 数组,不能两者兼得。

您需要将列表理解命令替换为非 Python 的命令序列来执行相同的操作。

【讨论】:

    猜你喜欢
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2021-11-17
    • 2018-03-29
    相关资源
    最近更新 更多