拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 生成大规模随机ndarray的快速方法

生成大规模随机ndarray的快速方法

白鹭 - 2022-01-26 2000 0 0

我想生成一个随机的 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 进行并行计算以获得更快的计算(也可以扩展到单台机器之外),请参阅生成大规模随机ndarray的快速方法

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *