【问题标题】:Numba cc export with numpy functions not working带有 numpy 功能的 Numba cc 导出不起作用
【发布时间】:2021-10-31 19:20:23
【问题描述】:

我刚开始使用 numba,我想根据本教程编译代码供以后使用: https://numba.pydata.org/numba-doc/dev/user/pycc.html

我在自己尝试某些功能时遇到问题。首先,它在网站上说您可以省略输出的类型以及当我尝试此功能时(与 webiste 相同,但输出没有 f8):

@cc.export('square', '(f8)')
def square(a):
    return a ** 2

我得到:TypeError: invalid signature: '(f8)' (type: 'str') 评估为 'Float' 而不是 tuple 或 Signature

但我这样做没有问题(去掉具有 2 个不同输入的函数的输出类型):

@cc.export('multf', '(f8, f8)')
@cc.export('multi', '(i4, i4)')
def mult(a, b):
    return a * b

第一个问题:我在这里做错了什么?

另外,我尝试自己运行一个函数,但在使用 numpy 数组时遇到了问题。我要编译的函数是:

@cc.export('VolumeTetrahedra', 'f8[:,:](f8[:], f8[:], f8[:], f8[:])')
def VolumeTetrahedra(a, b, c, d) :
    return abs(1/6 * np.linalg.det(np.asarray([[a[0], b[0], c[0], d[0]],[a[1], b[1], c[1], d[1]],[a[2], b[2], c[2], d[2]],[1,1,1,1]])))

哪个使用 numpy 函数(我检查过,numba 网站说这些函数应该可以工作,除非我读错了)

我只是得到这个错误: AssertionError: 在 nopython 模式管道中失败(步骤:本机降低)

所以基本上,如果我理解正确,numba 会尝试在不使用 python 的情况下更快地执行,但它不能用这个函数执行此操作,所以它给了我一个错误,我只是找不到将数组引入的方法numba 没有出现这种类型的错误,有没有办法编译我的示例函数或可以执行相同操作的函数?

如果有人可以帮助我解决我的 numba 问题,我会很感激,

谢谢,坦杰

【问题讨论】:

    标签: python numpy compilation numba


    【解决方案1】:

    Q1:TypeError: invalid signature: '(f8)' (type: 'str') 评估为 'Float' 而不是 tuple 或 Signature 是什么意思?

    这里的问题是python中一个元素周围的括号没有任何作用。他们不会让它成为一个有 1 个元素的元组。如果您将'(f8)' 替换为'(f8,)',它就可以正常工作。

    Q2:我的 VolumeTetrahedra 函数有什么问题?

    首先

    from numba.pycc import CC
    
    cc = CC('my_module')
    @cc.export('VolumeTetrahedra', 'f8[:,:](f8[:], f8[:], f8[:], f8[:])')
    def VolumeTetrahedra(a, b, c, d) :
        return abs(1/6 * np.linalg.det(np.asarray([[a[0], b[0], c[0], d[0]],[a[1], b[1], c[1], d[1]],[a[2], b[2], c[2], d[2]],[1,1,1,1]])))
    

    在我的机器上运行良好。我的意思是我可以运行它而不会出现异常。我正在运行 numba 版本 0.54.0。

    但这对我来说真的很奇怪。首先,numba 不会加速纯 numpy。然后你的 numpy 代码看起来很奇怪。为什么不干呢

    abs(1/6*np.linalg.det(np.concatenate([np.stack([a,b,c,d]).T, np.array([1,1,1,1]).reshape(1,-1)])))
    

    【讨论】:

    • 您好!谢谢你的回答! #1 是完美的,对于 #2,首先我想要在 3d 空间中由 4 个点表征的四面体的体积。我使用的公式可以在这里找到:en.wikipedia.org/wiki/Tetrahedron#Volume,特殊情况下 d 不等于 0。我在 numba 0.54.1 上运行,但即使我降级到您的版本 (0.54.0),它也无法在我的系统上运行.知道什么可能导致这种情况(我在 Windows 上使用 conda 版本)?此外,我在函数中还有其他东西要运行,但我将其缩小到问题所在,最终它不会是纯 python。
    • @Tanjay 你试过运行我声称有效的代码吗?另外我的观点是,使用 numba 编译它没有用,因为它不会加速纯 numpy 代码。
    • 是的,我尝试完全运行您发送给我的内容,但它不会编译,我没有收到错误但它失败并在我返回输出的行之前给我一个“^”。另外,当您说这部分不会更快时,我理解您的意思,但这部分是更大函数的一部分,其中包含使用 numba 会更快的代码,这部分只是它不会编译的部分,所以我将其重写为问题。
    • @Tanjay 这很奇怪。对我来说,它不仅可以编译,而且如果我输入向量,它还会计算体积。也许是一个 numba/numpy 错误。
    • 我不知道为什么,但每次我写一行包含 np.asarray() 或 np.array() 的代码时,由于某种原因它不会编译......?它总是停在那里而没有错误消息,只是在相应的代码行处有一个“^”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多