0
我需要乘以兩個巨大的向量(30720,1)*(1,30720),所以這將產生一個30720 * 30720矩陣。我使用numpy.dot來增加它們,但它需要很長時間。乘以兩個巨大的矩陣使用numpy.dot
我需要乘以兩個巨大的向量(30720,1)*(1,30720),所以這將產生一個30720 * 30720矩陣。我使用numpy.dot來增加它們,但它需要很長時間。乘以兩個巨大的矩陣使用numpy.dot
與float64
數據,結果大小約爲7 Go,因此它不適合大量的PC RAM。但是你只有30720²#1e9乘法運算,這需要幾秒鐘的時間。
避免記憶問題的辦法是削減的結果在合理的數據塊,與尺寸< 1Go,並保存在速度二進制協議文件中的部分結果,與加控制會發生什麼:
n=3
div=10240
a=rand(n*div,1)
b=rand(1,n*div)
import pickle
def calculate(i,j):
u=dot(a[i*div:(i+1)*div,:],b[:,j*div:(j+1)*div])
return u
def save(i,j,u):
with open('data'+str(i)+str(j)+'.pk','wb') as f :
pickle.dump(u,f)
def timecount(f,args):
t0=time.time()
res=f(*args)
return res,time.time()-t0
def multidot():
tcalc,tsave=0,0
for i in range(n):
for j in range(n):
print (i,j)
u,dt=timecount(calculate,(i,j))
tcalc+=dt
_,dt=timecount(save,(i,j,u))
tsave+=dt
print('dot time',tcalc)
print('save time',tsave)
然後運行:
In [64]: multidot()
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2
dot time 4.697121858596802
save time 29.11250686645508
所以,你有沒有問題dot
,只與內存問題。
讀回數據,由塊讀,塊,這樣的:
with open('data00.pk','rb') as f : u=pickle.load(f)
此運行後,不要忘了del data*.pk
,它需要6Go磁盤上;)
是什麼這與C++有關?而30kx30k的矩陣非常龐大,當然需要很長的時間進行計算。 –
當然這個乘法需要時間。而專門優化的低級例程通常比像numpy這樣的通用工具更有效率(即使numpy已經擅長這種操作)。那個卑鄙的人說,對於SO網站來說,任何認真的答案都可能太長,所以這個問題對我來說看起來太寬泛了。 –
Numpy使用類似BLAS的庫來進行這種計算。但記憶掉期可能會扼殺時間。 – hpaulj