- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将一个(数学复杂/涉及但操作很少)自制经验分布类从 C++/MATLAB(我都有)移植到 Python。
该文件有大约 1100 行代码,包括注释和测试数据,其中包括
if __name__ == "__main__":
位于文件底部。
第 83 行有函数声明:def cdf(self, x):
它编译并运行得很好,只是非常慢,所以我想用 @numba.jit(nopython=True)
进行编译以使其运行得更快。
但是,编译在文件 npts=len(x)
第 85 行函数的最早几行之一(仅前面的注释)处终止。
消息结尾为:
[1] During: typing of argument at
C:\Users\kdalbey\Canopy\scripts\empDist.py (85)
--%<-----------------------------------------------------------------
File "Canopy\scripts\empDist.py", line 85
This error may have been caused by the following argument(s):
- argument 0: cannot determine Numba type of <class '__main__.empDist'>
现在我确实在文件顶部做了 import numpy as np
但为了清楚地显示下面的消息,我尝试将 np
替换为 numpy
。但我可能错过了一些。
如果我使用npts=x.size
,我会收到相同的错误消息。
所以我尝试输入 x
为:
@numba.jit(nopython=True)
def cdf(self, x: numpy.ndarray(dtype=numpy.float64)):
我收到以下错误
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
C:\Users\kdalbey\Canopy\scripts\empDist.py in <module>()
15 np.set_printoptions(precision=16)
16
---> 17 class empDist:
18 def __init__(self, xdata):
19 npts=len(xdata)
C:\Users\kdalbey\Canopy\scripts\empDist.py in empDist()
81
82 @numba.jit(nopython=True)
---> 83 def cdf(self, x: np.ndarray(dtype=np.float64)):
84 # compute the value of cdf at vector of points x
85 npts = x.size
TypeError: Required argument 'shape' (pos 1) not found
但我不知道 1D numpy.ndarray
预先有多少个元素(它是任意的)
我猜我也许可以做
@numba.jit(nopython=True)
def cdf(self, x: numpy.ndarray(shape=(), dtype=numpy.float64)):
它会克服该错误,然后返回到
[1] During: typing of argument at
C:\Users\kdalbey\Canopy\scripts\empDist.py (85)
--%<-----------------------------------------------------------------
File "Canopy\scripts\empDist.py", line 85
This error may have been caused by the following argument(s):
- argument 0: cannot determine Numba type of <class '__main__.empDist'>
如果我执行 npts=int(x.size)
或 npts=numpy.int32(x.size)
,也会出现同样的错误,所以我确定问题出在 x
上。
最佳答案
由于多个问题(从 numba 版本 0.46.0 开始),您的方法存在问题:
numpy.ndarray(shape=(), dtype=numpy.float64)
确实尝试创建一个 NumPy 数组。您将其用作类型提示并不重要。它仍然执行(并且失败)。jit
中使用更合适的(对于 numba)签名,而不是类型提示。或者甚至更好:完全省略签名,让 numba 来解决。在大多数情况下,numba 更擅长,并且花费您更少的精力(如果您不需要限制类型)。jit
方法。更好的方法是创建一个函数并从您的方法中调用它。所以在你的情况下:
import numba as nb
@nb.njit
def _cdf(x):
# do something with x
class empDist:
def cdf(self, x):
result = _cds(x)
...
您的示例可能更复杂,但这应该为您提供一个良好的起点。如果您需要使用实例属性,只需将它们传递给 _cdf
(如果 numba 支持 them )。
总的来说,尝试在所有事情上使用 numba 并不是一个好主意。 Numba 的范围非常有限,但它的适用范围可能会令人惊叹。
就你而言,你说它很慢。那么第一步应该是分析你的代码并找出它慢的原因和位置。然后尝试找出是否可以用更快的方法解决这个瓶颈。通常问题不在于代码本身,而在于算法/方法。检查它是否使用次优方法。如果不是,它是一个数字重的部分,那么使用 numba 可能是有意义的 - 但请注意:通常您根本不需要 numba,因为只需通过优化即可获得足够的性能NumPy 部分。
关于python - 如何使 numba(nopython=true) 处理元素数量未知的一维 numpy.ndarray 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58864004/
我想将一个类对象传递给一个函数。我可以让它工作,但我想知道是否有我可以分配的类型?我有一个我正在尝试做的“最小”示例。 spec = [("a", float64),("b",float64)] @j
我有一个简单的函数来对扑克手牌进行排序(手牌是字符串)。 我用 rA,rB = rank(a),rank(b) 调用它,这是我的实现。没有 @jit(nopython=True) 也能很好地工作,但是
我在这里有一个简单的例子来帮助我理解使用 numba 和 cython。我是 numba 和 cython 的新手。我已经尽力结合所有技巧来使 numba 更快,并且在某种程度上,cython 也是如
我正在使用 numbas @jit 装饰器在 python 中添加两个 numpy 数组。如果我使用 @jit 与 python 相比,性能是如此之高。 然而,即使我传入 @numba.jit(nop
我需要为通用指标构建相异矩阵。由于我需要算法快速运行,所以我在 nopython 模式下使用了 numba 0.35。这是我的代码 import numpy as np from numba impo
Numba Cuda 有 syncthreads() 来同步一个 block 中的所有线程。如何在不退出当前内核的情况下同步网格中的所有 block ? 在 C-Cuda 中有一个 cooperati
有人尝试在Google合作伙伴中使用numba吗?我只是不知道如何在此环境中进行设置。 此刻,我陷入了错误library nvvm not found。 最佳答案 将此代码复制到单元格中。这个对我有用
我想编写一个函数,它既可以作为 jitted 函数运行,也可以作为普通 python 或对象模式 numba 运行,具体取决于 numba 是否能够进行类型推断。我实际上更喜欢普通的 python,但
我有一个非常简单的问题我无法解决。 我正在使用 Numba 和 Cuda。我有一个列表 T=[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0] 我想要一个包含列表元素的元组,如
我正在测试一些采用 numpy 数组的函数的 numba 性能,并比较: import numpy as np from numba import jit, vectorize, float64 im
我正在使用 Scipy 的 interpolate.interp1d 在 Python3 中插入一维数组。我想将它与 numba 一起使用,但不支持 scipy 和此功能。是否有 numba 支持
我是 Numba 的新手,我正在尝试使用 Numba(版本 0.54.1)在 Python 中实现旧的 Fortran 代码,但是当我添加 parallel = True 时,程序实际上变慢了.我的程
我需要在 Python 中创建一个位数组。到目前为止,我发现可以使用 bitarray 生成非常节省内存的数组。模块。 然而,我的最终目的是使用来自Numba 的@vectorize 装饰器。 . N
我认为这是一个简单的问题,但我发现 numba 文档缺乏关于如何将字符串类型与 numpy 数组和字典一起使用的信息。我有一个我想使用 numba 的函数,它需要一个邮政编码列表,然后是一个映射邮政编
假设我有两个功能 def my_sub1(a): return a + 2 def my_main(a): a += 1 b = mysub1(a) return b
在以下用于逻辑比较的 numba 编译函数中,性能下降的原因可能是什么: from numba import njit t = (True, 'and_', False) #@njit(boolean
我的代码使用如下列表的笛卡尔积: import itertools cartesian_product = itertools.product(list('ABCDEF'), repeat=n) n可
我正在使用 Numba(版本 0.37.0)来优化 GPU 代码。我想使用组合矢量化函数(使用 Numba 的 @vectorize 装饰器)。 导入和数据: import numpy as np f
我想知道在 numba 函数中计算两个列表的交集的最快方法。只是为了澄清:两个列表的交集示例: Input : lst1 = [15, 9, 10, 56, 23, 78, 5, 4, 9] lst2
我正在使用 Numba 非 python 模式和一些 NumPy 函数。 @njit def invert(W, copy=True): ''' Inverts elementwise
我是一名优秀的程序员,十分优秀!