我已經litterally花費周(在用Cython仍然雖然)改變我用Cython代碼以純C獲得速度併成爲能夠刪除GIL以執行多線程以獲得更高的速度。用Cython numpy的ndarray(N,4,2)轉換爲矢量[向量[對[雙,雙]]
與其他計算器的用戶的幫助下,我終於通過使用4個線程(與PRANGE)的雙重成功,並獲得了10倍純C VS用Cython一些蟒蛇,然後再一個因素3的循環部分我碼。
BUT爲了進入該循環我首先必須兩個維度(N,4,2)的3維numpy ndarrays
(和(K,4,2))轉換爲vector[vector[pair[double,double]]]
。 K和N相當大。
對於這個我做的:
cdef int N=200000 #Of this order of magnitude
cdef np.ndarray[DTYPE_t,ndim=3] numpy_array=np.random.uniform(size=(N,4,2))
t1=time.time()
cdef vector[vector[pair[double,double]]] c_structure
c_structure.reserve(N)
cdef int i
for i in range(N):
c_structure.push_back(numpy_array[i])
t2=time.time()
然而,這部分代碼,我認爲瑣碎已經成爲我的代碼的新的瓶頸! for循環的雙重需要我的電腦0.1S(而不是在原來的實現1.11s)單個線程上,這部分需要3整秒(1.5s的每個陣列)!這使得我的超級優化代碼比我原來的代碼慢了3倍(1.5 * 2 + 0.1)!
我在做什麼錯?!如何加速這個?!
見another related question that I asked
在這方面並不重要,但'np.random.uniform((N,4,2))'不返回3D陣列...請儘量讓[mcve]至少相對正確。 – MSeifert
感謝它現在糾正了 – jean
大部分時間是否有可能產生隨機數? –