- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想做一个通用函数,它以函数对象作为参数。
最简单的情况之一:
import numpy as np
import numba as nb
@nb.njit()
def test(a, f=np.median):
return f(a)
test(np.arange(10), np.mean)
test(np.arange(10))
按预期工作。
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
non-precise type pyobject
[1] During: typing of argument at <ipython-input-54-52cead0f097d> (5)
File "<ipython-input-54-52cead0f097d>", line 5:
def test(a, f=np.median):
return f(a)
^
This error may have been caused by the following argument(s):
- argument 1: cannot determine Numba type of <class 'function'>
This is not usually a problem with Numba itself but instead often caused by
the use of unsupported features or an issue in resolving types.
最佳答案
使用函数作为参数对于 numba 来说很棘手,而且非常昂贵。这在 Frequently Asked Questions: "1.18.1.1. Can I pass a function as an argument to a jitted function?" 中提到:
1.18.1.1. Can I pass a function as an argument to a jitted function?
As of Numba 0.39, you can, so long as the function argument has also been JIT-compiled:
@jit(nopython=True)
def f(g, x):
return g(x) + g(-x)
result = f(jitted_g_function, 1)However, dispatching with arguments that are functions has extra overhead. If this matters for your application, you can also use a factory function to capture the function argument in a closure:
def make_f(g):
# Note: a new f() is created each time make_f() is called!
@jit(nopython=True)
def f(x):
return g(x) + g(-x)
return f
f = make_f(jitted_g_function)
result = f(1)Improving the dispatch performance of functions in Numba is an ongoing task.
import numpy as np
import numba as nb
def test(a, func=np.median):
@nb.njit
def _test(a):
return func(a)
return _test(a)
>>> test(np.arange(10))
4.5
>>> test(np.arange(10), np.min)
0
>>> test(np.arange(10), np.mean)
4.5
import numpy as np
import numba as nb
@nb.njit()
def test(a, f=np.median):
return f(a)
@nb.njit
def wrapped_mean(a):
return np.mean(a)
@nb.njit
def wrapped_median(a):
return np.median(a)
>>> test(np.arange(10))
4.5
>>> test(np.arange(10), wrapped_mean)
4.5
>>> test(np.arange(10), wrapped_median)
4.5
import numpy as np
import numba as nb
_precompiled_funcs = {}
def test(a, func=np.median):
if func not in _precompiled_funcs:
@nb.njit
def _test(arr):
return func(arr)
result = _test(a)
_precompiled_funcs[func] = _test
return result
return _precompiled_funcs[func](a)
import numba as nb
def test(a, f=np.median):
return f(a)
关于python - 使用函数对象作为 numba njit 函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59573365/
给定以下最小可重现示例: import numpy as np from numba import jit # variable number of dimensions n_t = 8 # q is
我尝试缩短一些代码的计算时间。所以我使用 numba 模块的 njit 装饰器来做到这一点。在此示例中: import numpy as np from numba import jitclass,
我尝试将 numba 用于需要以 (int, int) 元组作为键对非常大的 (10e6) 字典进行搜索的函数。 import numpy as np from numba import njit m
我想更新 njit 函数内的类属性,但我事先不知道变量名称。为了说明这一点,我编写了以下代码 from numba import jitclass, jit, njit from numba impo
当输入和返回是字典时,如何使用 numba 加速功能? 我熟悉将 numba 用于接受数字和返回数组的函数,如下所示: @numba.jit('float64[:](int32,int32)',nop
我想做一个通用函数,它以函数对象作为参数。 最简单的情况之一: import numpy as np import numba as nb @nb.njit() def test(a, f=np.me
我有一个相当复杂的计算代码,我正在尝试加速和多线程。为了优化代码,我正在尝试找出哪些函数花费的时间最长或被调用的次数最多。 我以前没有真正分析过代码,所以我可能会遗漏一些东西。但是,我知道许多现有的分
我正在尝试编写一个用于值函数迭代的程序,并且我想利用 numba 库中的 nopython 模式。下面的代码并没有真正做任何事情(我想从头开始了解我在哪里犯了错误)。它应该只返回我在函数中创建的矩阵。
与 numba 合作,我偶然发现了非常意想不到的行为。我创建了一个 nb.njit我试图在其中创建一个 nb.typed.List 的函数的 int8 numpy数组,所以我尝试创建一个对应的 num
各位程序员大家好 我正在尝试制作 discrete Fourier transform在此 minimal working example与 numba.njit装饰器: import numba i
我正在尝试使用“nopython”模式在 python 中即时编译函数。当我不通过简单地使用 @numba.njit 装饰器提供类型信息时,该函数会进行编译。 这是应用了装饰器并包含键入信息的函数定义
我正在 njit 中编写一个函数来加速非常慢的水库操作优化代码。该函数根据水库水位和闸门可用性返回泄漏释放的最大值。我传入一个参数大小,指定要计算的流数(在某些调用中它是一个,在某些调用中它是多个)。
与 pandas 1.0.0 版本,.apply现在有ability使用numba jit功能。 有没有办法利用这个 .apply使用 .rolling 时的功能? 例如我有一个 pandas.Dat
我有一个包含 D 元素的一维整数数组(即 idx = np.array([i0, i1, ...]),s.t. idx.size = D),其中每个元素对应于具有 D 维度的 ND 数组的该维度的索引
代码在这里: import numba as nb import numpy as np @nb.njit def func(size): ary = np.array([np.arange(
最初的问题与使用 np.linspace 和数组作为开始和停止参数有关,尽管现在我遇到了我想出的解决方法的问题。 采取以下措施: from numba import njit import numpy
我正在尝试在 numba decorator @ njit 中对文本数组使用签名。比如这个无意义的函数: import numpy as np import numba as nb @nb.njit(
我是一名优秀的程序员,十分优秀!