Numba支持大整数吗?

时间:2019-02-22 11:57:56

标签: python biginteger factorial numba

我有一个阶乘查找表,其中包含前30个整数阶乘。该表在用numba.njit编译的函数中使用。问题是,大于20 !,该数字大于64位带符号整数(9,223,372,036,854,775,807),这会导致numba to raise a TypingError。如果将该表简化为仅包含前20个整数阶乘,则该函数运行良好。

在numba中有办法解决这个问题吗?也许通过在使用查找表的jit编译函数中声明较大的整数类型?

1 个答案:

答案 0 :(得分:1)

在Numba中可能有一些处理大整数的方法,但这不是我所知道的方法。

但是,由于我们知道您正在尝试在Numba中手动编码Beta distribution的评估,因此我还有其他建议。

但是首先,我们必须谨慎使用语言,以免混淆Beta distributionBeta function

我实际上建议将所有计算移至对数刻度。也就是说,不是计算Beta分布的pdf,而是计算 Beta分布的pdf的日志

此技巧通常用于统计计算中,因为pdf的对数值比pdf更加数值稳定。例如,Stan project仅用于计算对数后验密度。

从您的帖子历史记录中,我也知道您对MCMC感兴趣;使用log pdf执行MCMC也很常见。在MCMC的情况下,与对数标度不同的是, log -后验与 log 先验成正比,而不是使后验与似然比成正比。 plus log 可能性。

我建议您使用对数分布,因为这样可以避免必须为大n计算$ \ Gamma(n)$,这容易导致整数溢出。而是计算$ \ log(\ Gamma(n))$。但是您是否不需要计算$ \ Gamma(n)$来计算$ \ log(\ Gamma(n))$?其实没有您可以看一下scipy.special函数gammaln,该函数完全不必计算$ \ Gamma(n)$。接下来的一种方法是查看scipy.special.gammaln中的源代码,并以此为基础实现自己的numba实现。

在您的评论中,您还提到使用Spouge's Approximation来近似Gamma函数。我以前没有使用Spouge的近似值,但是我在Stirling's approximation上取得了成功。如果要使用这些近似值之一,请使用对数刻度,现在将获取近似值的对数。您将需要使用rules of logs来重写这些近似值。

考虑到以上所有因素,我建议将计算从pdf转移到pdf的日志中。为了计算Beta 分布的log pdf,我将使用this approximation of the Beta function。使用日志规则重写该近似值和Beta pdf。然后,您可以实现这就是Numba,而不必担心整数溢出。

编辑

抱歉,我不确定如何在堆栈溢出时格式化数学。