我想生成一個隨機的 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 進行并行計算以獲得更快的計算(也可以擴展到單臺機器之外),請參閱
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/389937.html
