我发现我的模拟瓶颈之一是从泊松分布产生的随机数。我原来的代码是这样的Numba和随机数从泊松分布
import numpy as np
#Generating some data. In the actual code this comes from the previous
#steps in the simulation. But this gives an example of the type of data
n = 5000000
pop_n = np.array([range(500000)])
pop_n[:] = np.random.poisson(lam=n*pop_n/np.sum(pop_n))
现在,我读到numba可以非常简单地提高速度。我定义了功能
from numba import jit
@jit()
def poisson(n, pop_n, np=np):
return np.random.poisson(lam=n*pop_n/np.sum(pop_n))
这个确实运行得比原来快。不过,我尝试走得更远:)当我写
@jit(nopython=True)
def poisson(n, pop_n, np=np):
return np.random.poisson(lam=n*pop_n/np.sum(pop_n))
我
Failed at nopython (nopython frontend)
Invalid usage of Function(np.random.poisson) with parameters (array(float64, 1d, C))
Known signatures:
* (float64,) -> int64
*() -> int64
* parameterized
一些问题:为什么是这样的错误发生,如何解决它。
有更好的优化吗?
看起来Numba还不支持从任何np.random函数返回数组。您应该首先设置一个指定其项目类型的空数组,然后才能添加值。看看这里的例子https://github.com/numba/numba/issues/1596 –
我没有看到任何实际的原因,为什么这个功能应该更快。 'np.random.poisson'已经在C中实现了。在另一个编译函数中包装它最多会被编译器优化,最坏的情况是会导致开销。 – kazemakase
@kazemakase pop_n上的操作怎么样?它的数组除以它的总和? –