質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1714閲覧

[Python]Numbanのjitモジュールを用いても計算速度が変わらない

GIBA

総合スコア10

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/02/09 07:55

編集2019/02/09 15:50

前提・実現したいこと

Python初心者です。
現在,大学で実験をしており,
その際に得られる実験結果をPythonで処理したいと考えております。

実験結果が膨大であるため計算処理を早く行う必要があり,
numbaのjitモジュールをimportして、コードに@jitとデコレータを付けました.

発生している問題・エラーメッセージ

@jitをつけていないときとほとんど計算速度が変わらない
※エラーメッセージは出ず,コードの実行自体はできる

該当のソースコード

Python

1 2import numpy as np 3import matplotlib.pyplot as plt 4import heapq 5import os 6from numba import jit 7 8if not(os.path.isdir("Instant")): 9 os.makedirs("Instant") 10if not(os.path.isdir("Instant\TecPlot Data")): 11 os.makedirs("Instant\TecPlot Data") 12 13with open('velNumber.txt', 'r') as f: 14 velNumber=f.read() 15X, Y, Um, Vm ,Wm, Urms, Vrms, Wrms=np.loadtxt("Statistic Amount\toukei_all.plt", skiprows=3, unpack=True) 16a=0 17b=0 18 19 20 21#-------Gradient tensor------- 22@jit("f8[:](i8)") 23def CalDudx(Number): 24 dudx=np.zeros(Number) 25 for i in range(Number-1): 26 dudx[i]=(u[i+1]-u[i])/(x[i+1]-x[i]) 27 if x[0]==x[i+1]: 28 i+=1 29 return dudx 30 31@jit("f8[:](i8)") 32def CalDvdx(Number): 33 dvdx=np.zeros(Number) 34 for i in range(Number-1): 35 dvdx[i]=(v[i+1]-v[i])/(x[i+1]-x[i]) 36 if x[0]==x[i+1]: 37 i+=1 38 return dvdx 39 40@jit("f8[:](i8)") 41def CalDwdx(Number): 42 dwdx=np.zeros(Number) 43 for i in range(Number-1): 44 dwdx[i]=(w[i+1]-w[i])/(x[i+1]-x[i]) 45 if x[0]==x[i+1]: 46 i+=1 47 return dwdx 48 49@jit("f8[:](i8)") 50def CalDudy(Number): 51 k=0 52 dudy=np.zeros(Number) 53 for i in range(1,Number): 54 if x[k]==x[i]: 55 dudy[k]=(u[k]-u[i])/(y[k]-y[i]) 56 k+=1 57 i=k+1 58 return dudy 59 60@jit("f8[:](i8)") 61def CalDvdy(Number): 62 k=0 63 dvdy=np.zeros(Number) 64 for i in range(1,Number): 65 if x[k]==x[i]: 66 dvdy[k]=(v[k]-v[i])/(y[k]-y[i]) 67 k+=1 68 i=k+1 69 return dvdy 70 71@jit("f8[:](i8)") 72def CalDwdy(Number): 73 k=0 74 dwdy=np.zeros(Number) 75 for i in range(1,Number): 76 if x[k]==x[i]: 77 dwdy[k]=(w[k]-w[i])/(y[k]-y[i]) 78 k+=1 79 i=k+1 80 return dwdy 81 82@jit("f8[:](i8, f8[:], f8[:])") 83def CalDwdz(Number, dudx, dvdy): 84 dwdz=np.zeros(Number) 85 for i in range(Number): 86 dwdz[i]=-(dudx[i]+dvdy[i]) 87 return dwdz 88#---------------------------- 89 90 91 92 93#-------Fluctuation velocity------- 94@jit("f8[:](i8, f8[:], f8[:])") 95def CalUfluc(Number, u, Um): 96 Ufluc=np.zeros(Number) 97 for i in range(Number): 98 Ufluc[i]=u[i]-Um[i] 99 return Ufluc 100 101@jit("f8[:](i8, f8[:], f8[:])") 102def CalVfluc(Number, v, Vm): 103 Vfluc=np.zeros(Number) 104 for i in range(Number): 105 Vfluc[i]=v[i]-Vm[i] 106 return Vfluc 107 108@jit("f8[:](i8, f8[:], f8[:])") 109def CalWfluc(Number, w, Wm): 110 Wfluc=np.zeros(Number) 111 for i in range(Number): 112 Wfluc[i]=w[i]-Wm[i] 113 return Wfluc 114#---------------------------- 115 116 117 118 119 120 121 122 123 124 125 126#--------Start point of Y-cordinate------- 127@jit("f8[:](i8)") 128def CalStartY(Number): 129 a=0 130 for i in range(1,Number): 131 if not(y[i-1]==y[i]): 132 a+=1 133 if int(a)==int(5): 134 a=i 135 break 136 return a 137 138@jit("f8[:](i8, i8)") 139def CalEndY(Number, a): 140 b=Number-a 141 return b 142#---------------------------- 143 144 145 146 147for t in range(1,int(velNumber)+1): 148 No, IX, IY, x, y, z, u, v, w, vL2, vL3, Vorticity_wz, Status = np.loadtxt("stereo\vel{:03}.plt".format(t), skiprows=11, unpack=True) 149 XmaxCut=heapq.nlargest(6, x) 150 XminCut=heapq.nsmallest(6, x) 151 Number=len(No) 152 153 dudx=CalDudx(len(No)) 154 dvdx=CalDvdx(len(No)) 155 dwdx=CalDwdx(len(No)) 156 dudy=CalDudy(len(No)) 157 dvdy=CalDvdy(len(No)) 158 dwdy=CalDwdy(len(No)) 159 dwdz=CalDwdz(len(No), dudx, dvdy) 160 Ufluc=CalUfluc(len(No), u, Um) 161 Vfluc=CalVfluc(len(No), v, Vm) 162 Wfluc=CalVfluc(len(No), w, Wm) 163 StartY=CalStartY(len(No)) 164 EndY=CalEndY(len(No), StartY) 165 166 with open('Instant\TecPlot Data\vel{:03}.plt'.format(t), 'w') as f: 167 f.write("TITLE=TecPlot Data{:03}\n".format(t)) 168 f.write("VARIABLES =\"X\" \"Y\" \"U\" \"V\" \"W\" \"U\'\" \"V\'\" \"W\'\" \"dudx\" \"dvdx\" \"dwdx\" \"dvdy\" \"dwdx\" \"dwdy\" \"Q\" \"lambda0\" \"lambda0(without x gradient)\" \"lambda0(without y gradient)\" \"lambda0(without z gradient)\" \n") 169 f.write("ZONE T=\"STAT\", I=1, J=200, K=1, F=POINT\n") 170 for i in range(int(StartY), int(EndY)): 171 if not(x[i]==XmaxCut[0] or x[i]==XmaxCut[1] or x[i]==XmaxCut[2] or x[i]==XmaxCut[3] or x[i]==XmaxCut[4] or x[i]==XmaxCut[5] or x[i]==XminCut[0] or x[i]==XminCut[1] or x[i]==XminCut[2] or x[i]==XminCut[3] or x[i]==XminCut[4] or x[i]==XminCut[5]): 172 f.write("{:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e} {:>15e}\n".format(x[i], y[i], u[i], v[i], w[i], Ufluc[i], Vfluc[i], Wfluc[i], dudx[i], dvdx[i], dwdx[i], dudy[i], dvdy[i], dwdy[i], dwdz[i],)) 173 print(t)

試したこと

@jitに型指定をした

補足情報(FW/ツールのバージョンなど)

初心者のため効率を考えたコードではありませんが
原因を突き止めていただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2019/02/09 07:59

https://teratail.com/tour を参考に質問を再編集してコードをシンタックスハイライト・マークダウンで囲ってください。現状読めないので
guest

回答1

0

jitコンパイルに失敗した場合は、そのまま元のpythonコードが実行されます。

nopython=Trueオプションを付けるとjitコンパイルに失敗した場合はエラーを吐くという動作になるので、とりあえずそれをつけてみると良いと思います。

投稿2019/02/09 08:02

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問