質問内容
Pythonで作成した配列計算の処理速度向上を検討しております。
色々試したところ、行きついたのがmultiprocessです。
multiprocessでは処理速度が2倍程度向上しましたが、もう少し速くしたいと考えております。
お手数ですがなにか案があればご回答頂けると幸いです。
試したこと
■ Cython・・・処理速度はほぼ変わりませんでした。
■ numba(jit)・・・処理速度はほぼ変わりませんでした。
■ multiprocess・・・約2倍程度向上。
サンプルコード
python
1import numpy as np 2import time as t 3 4start = t.time() 5np.random.seed(0) 6x = np.random.rand(100) 7y = np.random.rand(1000, 1000) 8z = np.random.rand(1000, 1000) 9 10a = 0 11b = np.zeros((y.shape[0], y.shape[1])) 12c = np.zeros((z.shape[0], z.shape[1])) 13 14for j in reversed(range(5)): 15 for i in reversed(range(5)): 16 17 p = x[a] * y ** i * z ** j 18 q = x[a + 25] * y ** i * z ** j 19 b = b + p 20 c = c + q 21 a = a + 1 22 23print('time : ' + str(round((t.time() - start),5)) + ' [sec]')
上記コードをマルチプロセス化
python
1import numpy as np 2import time as t 3from multiprocessing import Pool, Array 4 5def f(args): 6 7 x = args[0] 8 y = args[1] 9 z = args[2] 10 a = args[3] 11 i = args[4] 12 j = args[5] 13 14 p = x[a] * y ** i * z ** j 15 q = x[a + 25] * y ** i * z ** j 16 17 return p, q 18 19def main(): 20 21 start = t.time() 22 23 p = Pool(processes=8) 24 np.random.seed(0) 25 x = np.random.rand(100) 26 y = np.random.rand(1000, 1000) 27 z = np.random.rand(1000, 1000) 28 29 b = np.zeros((y.shape[0], y.shape[1])) 30 c = np.zeros((z.shape[0], z.shape[1])) 31 32 ii = [] 33 jj = [] 34 aa = np.arange(25) 35 for j in reversed(range(5)): 36 for i in reversed(range(5)): 37 ii.append(i) 38 jj.append(j) 39 40 args = [(x, y, z, aa[i], ii[i], jj[i]) for i in range(25)] 41 out = p.map(f, args) 42 43 for k in range(25): 44 b = b + out[k][0][:] 45 c = c + out[k][1][:] 46 47 print('time : ' + str(round((t.time() - start),5)) + ' [sec]') 48 49if __name__ == "__main__": 50 main()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/23 04:36