【问题标题】:Numba jit nopython mode: tell numba the signature of an external arbitrary functionNumba jit nopython 模式:告诉 numba 外部任意函数的签名
【发布时间】:2017-10-11 20:05:04
【问题描述】:

我需要为通用指标构建一个相异矩阵。由于我需要算法快速运行,所以我在nopython 模式下使用了numba 0.35。 这是我的代码

import numpy as np
from numba import jit
from jellyfish import levenshtein_distance

def _dissimilarity_matrix(metric):
    @jit(nopython=True)
    def dm(data):
        n = data.shape[0]
        diss = np.zeros((n, n))
        for i in range(n):
            for j in range(i+1):
                dist = metric(data[i], data[j])
                diss[i, j] = dist
                diss[j, i] = dist
        return diss

    return dm

@jit(nopython=True)
def euclidean_distance(vec1, vec2):
    return np.sqrt(((vec1 - vec2)**2).sum())

test1 = np.random.randn(10, 2)
dissimilarity_matrix1 = _dissimilarity_matrix(euclidean_distance)
diss1 = dissimilarity_matrix1(test1)

test2 = np.array(["this", "is", "a", "test"])
dissimilarity_matrix2 = _dissimilarity_matrix(levenshtein_distance)
diss2 = dissimilarity_matrix2(test2)

但输出是:

numba.errors.TypingError: Failed at nopython (nopython frontend)
Untyped global name 'metric': cannot determine Numba type of <class 'builtin_function_or_method'>
File "test.py", line 12

请注意,函数euclidean_distance 是我定义的,并且有装饰器@jit(nopython=True),而函数levenshtein_distance 来自外部模块(不是我编写的)。有没有办法明确告诉numba 传入的函数的签名(即_dissimilarity_matrix 中的metric)? 我真的需要函数_dissimilarity_matrixnopython 模式下运行并接受任意函数作为输入。

【问题讨论】:

  • 在 nopython 模式下不能调用任意 Python 函数。这是 nopython 模式的核心定义特征:没有 Python。
  • 那么如果我不自己定义所有的函数,让它们运行在nopython模式下,没有办法吗?

标签: python numpy numba


【解决方案1】:

metriceuclidean_distance 时,您的代码对我有效,因为这也是一个nopython jitted numba 函数。但是,您不能传入任意函数。为了使某些东西在nopython 模式下工作,每个可调用函数都必须由 numba 支持(请参阅http://numba.pydata.org/numba-doc/latest/reference/pysupported.htmlhttp://numba.pydata.org/numba-doc/latest/reference/numpysupported.html)或用户定义为 numba nopython 函数。没有绕过这个限制。

【讨论】:

  • 谢谢。甚至像jit(levenshtein_distance)njit(levenshtein_distance) 这样的东西都不会这样做,对吧?我必须编写自己的函数,用@jit(nopython=True) 装饰。
  • 如果 levenshtein_distance 以 numba 可以 jit 的方式编写,那么它可以工作,但它必须遵守我提供的链接中支持的功能。跨度>
猜你喜欢
  • 2020-08-08
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
相关资源
最近更新 更多