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

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

ただいまの
回答率

87.61%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,190

score 10

前提・実現したいこと

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

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

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

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

該当のソースコード

import numpy as np
import matplotlib.pyplot as plt
import heapq
import os
from numba import jit

if not(os.path.isdir("Instant")):
 os.makedirs("Instant")
if not(os.path.isdir("Instant\\TecPlot Data")):
 os.makedirs("Instant\\TecPlot Data")

with open('velNumber.txt', 'r') as f: 
 velNumber=f.read()
X, Y, Um, Vm ,Wm, Urms, Vrms, Wrms=np.loadtxt("Statistic Amount\\toukei_all.plt", skiprows=3, unpack=True) 
a=0
b=0



#-------Gradient tensor-------
@jit("f8[:](i8)")
def CalDudx(Number):
 dudx=np.zeros(Number)
 for i in range(Number-1):
  dudx[i]=(u[i+1]-u[i])/(x[i+1]-x[i])
  if x[0]==x[i+1]:
   i+=1
 return dudx

@jit("f8[:](i8)")
def CalDvdx(Number):
 dvdx=np.zeros(Number)
 for i in range(Number-1):
  dvdx[i]=(v[i+1]-v[i])/(x[i+1]-x[i])
  if x[0]==x[i+1]:
   i+=1
 return dvdx

@jit("f8[:](i8)")
def CalDwdx(Number):
 dwdx=np.zeros(Number)
 for i in range(Number-1):
  dwdx[i]=(w[i+1]-w[i])/(x[i+1]-x[i])
  if x[0]==x[i+1]:
   i+=1
 return dwdx

@jit("f8[:](i8)")
def CalDudy(Number):
 k=0
 dudy=np.zeros(Number)
 for i in range(1,Number):
  if x[k]==x[i]:
   dudy[k]=(u[k]-u[i])/(y[k]-y[i])
   k+=1
   i=k+1
 return dudy

@jit("f8[:](i8)")
def CalDvdy(Number):
 k=0
 dvdy=np.zeros(Number)
 for i in range(1,Number):
  if x[k]==x[i]:
   dvdy[k]=(v[k]-v[i])/(y[k]-y[i])
   k+=1
   i=k+1
 return dvdy

@jit("f8[:](i8)")
def CalDwdy(Number):
 k=0
 dwdy=np.zeros(Number)
 for i in range(1,Number):
  if x[k]==x[i]:
   dwdy[k]=(w[k]-w[i])/(y[k]-y[i])
   k+=1
   i=k+1
 return dwdy  

@jit("f8[:](i8, f8[:], f8[:])")
def CalDwdz(Number, dudx, dvdy):
 dwdz=np.zeros(Number)
 for i in range(Number):
  dwdz[i]=-(dudx[i]+dvdy[i])
 return dwdz
#----------------------------




#-------Fluctuation velocity------- 
@jit("f8[:](i8, f8[:], f8[:])")
def CalUfluc(Number, u, Um):
 Ufluc=np.zeros(Number)
 for i in range(Number):
  Ufluc[i]=u[i]-Um[i]
 return Ufluc

@jit("f8[:](i8, f8[:], f8[:])")
def CalVfluc(Number, v, Vm):
 Vfluc=np.zeros(Number)
 for i in range(Number):
  Vfluc[i]=v[i]-Vm[i]
 return Vfluc

@jit("f8[:](i8, f8[:], f8[:])")
def CalWfluc(Number, w, Wm):
 Wfluc=np.zeros(Number)
 for i in range(Number):
  Wfluc[i]=w[i]-Wm[i]
 return Wfluc
#----------------------------











#--------Start point of Y-cordinate-------
@jit("f8[:](i8)")
def CalStartY(Number):
 a=0
 for i in range(1,Number):
  if not(y[i-1]==y[i]):
   a+=1
  if int(a)==int(5):
   a=i
   break
 return a

@jit("f8[:](i8, i8)")
def CalEndY(Number, a):
 b=Number-a
 return b
#----------------------------   




for t in range(1,int(velNumber)+1):
 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)
 XmaxCut=heapq.nlargest(6, x)
 XminCut=heapq.nsmallest(6, x) 
 Number=len(No)

 dudx=CalDudx(len(No))
 dvdx=CalDvdx(len(No))
 dwdx=CalDwdx(len(No))
 dudy=CalDudy(len(No))
 dvdy=CalDvdy(len(No))
 dwdy=CalDwdy(len(No))
 dwdz=CalDwdz(len(No), dudx, dvdy)
 Ufluc=CalUfluc(len(No), u, Um)
 Vfluc=CalVfluc(len(No), v, Vm)
 Wfluc=CalVfluc(len(No), w, Wm)
 StartY=CalStartY(len(No))
 EndY=CalEndY(len(No), StartY)

 with open('Instant\\TecPlot Data\\vel{:03}.plt'.format(t), 'w') as f: 
  f.write("TITLE=TecPlot Data{:03}\n".format(t))
  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")
  f.write("ZONE T=\"STAT\", I=1, J=200, K=1, F=POINT\n")
  for i in range(int(StartY), int(EndY)):
   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]):
    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],))
 print(t) 

試したこと

@jitに型指定をした

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayataka2049

    2019/02/09 16:59

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

    キャンセル

回答 1

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る