如何用nopython模式从numba调用math.factorial?

问题描述 投票:1回答:1

我需要在一个for循环中计算大整数的阶乘,我想用numba编译。我需要在一个for循环中计算大整数的阶乘,我想使用numba编译。factorial Python的数学模块中的函数似乎很快。如何使用nopython模式从numba调用这个函数?不幸的是,这个函数目前不被numba支持。https:/numba.pydata.orgnumba-doc0.17.0referencepysupported.html。.

import math
from numba import njit

@njit
def factorial(n):
    return math.factorial(n)

factorial(2)

抛出一个TypingError。

TypingError: Failed in nopython mode pipeline (step: nopython frontend) Unknown attribute 'factorial' of type Module(<module 'math' from '/anaconda3/envs/minimalcondaforge/lib/python3.8/lib-dynload/math.cpython-38-darwin.so'>)

有没有办法调用这个函数?我可以使用 @overloadget_cython_function_address 如上所述 http:/numba.pydata.orgnumba-doclatestextendinghigh-level.html。? (到目前为止,我还不能让它工作,我是numba新手,所以我可能只是做得不对。) 也欢迎其他关于numba中快速阶乘函数的建议,但它需要能够处理大整数。

python numba
1个回答
2
投票

Numba 不能编译 Python 的任意精度整数,所以如果你想找到大于 20 的整数的精确阶乘--2432902008176640000 是 64 位整数中最多的一个--那么 Numba 很不幸不会有帮助。

如果你不需要大的阶乘的精确整数,那么你可以定义你的阶乘函数为等价于 math.gamma(n+1)在Numba下编译,并有浮点输出。即使如此,它也只能在 170!不过,这是64位浮点数中能容纳的最大数值。

在没有任意精度数的情况下,较大的阶乘需要用对数形式表示。为此,你可以使用 math.lgamma(n+1),它也可以在Numba下编译,并能返回 log(n!) 对于很高的n。

© www.soinside.com 2019 - 2024. All rights reserved.