我想生成一个随机的 shape 矩阵(1e7, 800)
。但我发现numpy.random.rand()
在这个规模上变得非常缓慢。有没有更快的方法?
uj5u.com热心网友回复:
一种简单的方法是使用Numba撰写多执行绪实作:
import numba as nb
import random
@nb.njit('float64[:,:](int_, int_)', parallel=True)
def genRandom(n, m):
res = np.empty((n, m))
# Parallel loop
for i in nb.prange(n):
for j in range(m):
res[i, j] = np.random.rand()
return res
这比我的 6 核机器快 6.4 倍np.random.rand()
。
请注意,使用32 位浮点数可能有助于稍微加快计算速度,尽管精度会降低。
uj5u.com热心网友回复:
Numba
是一个不错的选择,另一个可能效果很好的选项是dask.array
,它将创建 numpy 阵列的惰性块并在块上执行并行计算。在我的机器上,我的速度提高了 2 倍(对于 1e6 x 1e3 矩阵,因为我的机器上没有足够的存储器)。
rows = 10**6
cols = 10**3
import dask.array as da
x = da.random.random(size=(rows, cols)).compute() # takes about 5 seconds
# import numpy as np
# x = np.random.rand(rows, cols) # takes about 10 seconds
请注意,.compute
最后只是将计算出的阵列带入存储器,但是通常您可以继续利用 dask 进行并行计算以获得更快的计算(也可以扩展到单台机器之外),请参阅
0 评论