我想使用scipy.stats的Beta.rvs函数生成大小为(500,1000000)的矩阵.
我已经try 了多线程,但仍然花费了太多的时间.有没有其他方法可以缩短执行时间?有没有其他图书馆可以做同样的事情?
我想使用scipy.stats的Beta.rvs函数生成大小为(500,1000000)的矩阵.
我已经try 了多线程,但仍然花费了太多的时间.有没有其他方法可以缩短执行时间?有没有其他图书馆可以做同样的事情?
你可以用numba来计算parallel with prange中的值:
import numpy as np
from scipy.stats import beta
import numba as nb
import matplotlib.pyplot as plt
a, b = 0.5, 10
N = 50, 1000000
result1 = beta.rvs(a, b, size=N)
@nb.njit(parallel=True, fastmath=True)
def beta_rvs(a, b, shape):
out = np.empty(shape, dtype=np.float64).reshape(-1)
size = np.asarray(shape).prod()
for i in nb.prange(size):
out[i] = np.random.beta(a, b)
return out.reshape(shape)
result2 = beta_rvs(a, b, N)
%timeit -n 1 -r 1 beta.rvs(a, b, size=N)
%timeit -n 1 -r 1 beta_rvs(a, b, N)
输出:
3.62 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
696 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
使用请求的形状输出:
39.1 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
6.75 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
直方图:
plt.hist(result1.ravel())
plt.hist(result2.ravel())