前提・実現したいこと
このpython3のプログラムをnumbaで高速化するにはどうしたら良いでしょうか。
配列内にcsvファイルから取り込んだ3次元点軍の座標データを入れ、3次元のアフィン変換で座標変換をするプログラムです。
### 該当のソースコード python3 import numpy as np import pandas import pickle import redis import numba import time # 時間計測用メソッド def calctime(func): start = time() r = func() return {'value': r, 'time': time()-start} #以下,希望するアフィン変換の関数 def zrot (yaw,x,y,z): return np.array([ [1,0,0,x], [0,np.cos(yaw),-np.sin(yaw),y], [0,np.sin(yaw),np.cos(yaw),z], [0,0,0,1]]) def yrot (roll): return np.array([[np.cos(roll),0,np.sin(roll),0], [0,1,0,0], [-np.sin(roll),0,np.cos(roll),0], [0,0,0,1]]) def xrot (pitch): return np.array([[np.cos(pitch),-np.sin(pitch),0,0], [np.sin(pitch),np.cos(pitch),0,0], [0,0,1,0 ], [0,0,0,1]]) def main(): # csvの読み込み csv = pandas.read_csv('10[m]MergedFilecarXYZonly.csv',header=None) # バージョン2のプロトコルを利用してバイト列をダンプ dumped = pickle.dumps(csv, protocol=2) # ダンプしたバイト列をredisに保存 r = redis.Redis(host='localhost', port=6379, db=0) r.set('10[m]MergedFilecarXYZonly.csv', dumped) A = pickle.loads(r.get('10[m]MergedFilecarXYZonly.csv')) return A #npdataの形を、pandaで読み込んだデータフレームの形に変形する #@numba.jit def doit(A): npdata=np.array(A.values.flatten()) print(npdata) print("\nok") XYZarray = np.reshape(npdata,(-1,3)) yaw_tgt = 0*(np.pi/180) X_tgt = 0 Y_tgt = 0 Z_tgt = 0 roll_tgt =0 pitch_tgt = 0 yaw_car = 0*(np.pi/180) X_car = 0 Y_car = 0 Z_car = 0 roll_car = 0 pitch_car = 0 #affin = np.empty(4,4,dtype=np.float64) #A = np.empty(4,4,dtype=np.float64) #B = np.empty(4,4,dtype=np.float64) #C = np.empty(4,4,dtype=np.float64) A = np.dot(zrot(yaw_tgt,X_tgt,Y_tgt,Z_tgt) ,yrot(roll_tgt)) B = np.dot(xrot(pitch_tgt), zrot((-1)*yaw_car,(-1)*X_car,(-1)*Y_car,Z_car)) C = np.dot(yrot((-1)*roll_car),xrot((-1)*pitch_car)) affin = np.dot(A,B) affin = np.dot(affin,C) #座標変換用のアフィン変換行列affinをデータの転地行列にかける XYZarray2 = np.empty(np.shape(XYZarray.T)) Dot_af = np.vstack( (XYZarray.T,np.ones(np.shape(XYZarray.T[0,:])))) XYZarray_af = np.dot(affin , Dot_af) XYZarray2 = XYZarray_af[0:3,:].T #print(XYZarray) print("2tつめ") print(XYZarray2) print("おk") start = time.time() B = main() doit(B) print("original took %f s" %(time.time() - start))
### 試したこと def doit()の上に@numba.jit を書いてみましたが以下のメッセージが出て低速化します(書く前:0.013074 s→書いた後:0.815948 s) zenbuyasoudan.py:67: NumbaWarning: Compilation is falling back to object mode WITH looplifting enabled because Function "doit" failed type inference due to: Untyped global name 'zrot': cannot determine Numba type of <class 'function'> File "zenbuyasoudan.py", line 92: def doit(A): <source elided> A = np.dot(zrot(yaw_tgt,X_tgt,Y_tgt,Z_tgt) ,yrot(roll_tgt)) ^ @numba.jit /home/hiroki/anaconda3/lib/python3.7/site-packages/numba/compiler.py:725: NumbaWarning: Function "doit" was compiled in object mode without forceobj=True. File "zenbuyasoudan.py", line 68: @numba.jit def doit(A): ^ self.func_ir.loc)) /home/hiroki/anaconda3/lib/python3.7/site-packages/numba/compiler.py:734: NumbaDeprecationWarning: Fall-back from the nopython compilation path to the object mode compilation path has been detected, this is deprecated behaviour. For more information visit http://numba.pydata.org/numba-doc/latest/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit File "zenbuyasoudan.py", line 68: @numba.jit def doit(A): ^ warnings.warn(errors.NumbaDeprecationWarning(msg, self.func_ir.loc)) ### 補足情報(FW/ツールのバージョンなど) 環境はubuntu18.04でvsdodeとanacondaを用いています どうかよろしくお願い申し上げます
あなたの回答
tips
プレビュー