スピードを上げているためにはサイレントコードに変更するだけですより多くの速度を得るためにGILを削除してマルチスレッドを行うことができます。私のループのための二重の部分で、私は最終的に成功し、いくつかのpythonでcython VS率10純粋なCを獲得し、再び(PRANGEで)4つのスレッドを使用して、因子3仲間stackoverflowのユーザーの助けを借りてCythonはnumpy ndarray(N、4,2)をベクターに変換します。
コード。私が最初にvector[vector[pair[double,double]]]
寸法(N、4,2)(及び(K、4,2))の2個の3次元numpy ndarrays
を変換する必要があり、このループに入るために
BUT。 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()
しかし、私は些細なが私のコードの新しいボトルネックとなっているとみなされるコードのこの部分を!!! double forループは、私のコンピュータにかかります0.1s(元の実装では1.11sではなく)シングルスレッドで、この部分は3秒間で続きます(各配列1.5s)!これは私の超最適化されたコードを元のコード(1.5 * 2 + 0.1)よりも3倍遅くする!
私は間違っていますか?これをスピードアップする方法は?
はあなたがNx4x2配列を持っていて、vector[vector[pair[double,double]]
に変換されanother related question that I asked
本当に重要ではないが、 'np.random.uniform((N、4,2))' 3次元配列を返しません... [mcve]を少なくとも比較的正確にするようにしてください。 – MSeifert
ありがとうございました – jean
ほとんどの場合、乱数を生成することは可能でしょうか? –