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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

Q&A

解決済

2回答

645閲覧

for文、リストを多用しているコードを高速化したい

aine_

総合スコア22

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

0グッド

0クリップ

投稿2018/12/05 09:20

pythonでコードをつくったのですが回るのが非常に遅くてこまっています。
高速化したいコードは以下の通りです。稚拙なコードですがご教授おねがいします。

python

1import h5py 2import numpy as np 3import matplotlib.pyplot as plt 4kekka = [] 5 6#hdfファイルからデータを読み取る 7# %d:各時間のデータ 8for b in range (0,40000,100): 9 hdf5 = h5py.File("C:file_%d.hdf5"%(b), 'r') 10 list_x=(hdf5["particles/fluid/arrays/x"].value.tolist()) 11 list_y=(hdf5["particles/fluid/arrays/y"].value.tolist()) 12 list_z=(hdf5["particles/fluid/arrays/z"].value.tolist()) 13 list_p=(hdf5["particles/fluid/arrays/p"].value.tolist()) 14 #z座標(高さ)の条件をわける 15 Z=[] 16 zkiriwake = [0.001*x for x in range(1,2001,20)] 17 for u in zkiriwake: 18 zyouso = [j for j, takasa in enumerate(list_z) if (u+0.02)>=takasa>=(u)] 19 Z.append(zyouso) 20 21 #x,y座標の条件わけ 22 r = [i for i, (x, y) in enumerate(zip(list_x, list_y)) if 0.15*0.15>=((x-7.0)**2+y**2) and x>=7.0 ] 23 y1 = [i for i, y in enumerate(list_y) if -0.8>=y>=-0.10] 24 y2 = [i for i, y in enumerate(list_y) if -0.06>=y>=-0.08] 25 y3 = [i for i, y in enumerate(list_y) if -0.04>=y>=-0.06] 26 y4 = [i for i, y in enumerate(list_y) if -0.02>=y>=-0.04] 27 y5 = [i for i, y in enumerate(list_y) if 0>=y>=-0.02] 28 y6 = [i for i, y in enumerate(list_y) if 0.02>=y>=0] 29 y7 = [i for i, y in enumerate(list_y) if 0.04>=y>=0.02] 30 y8 = [i for i, y in enumerate(list_y) if 0.06>=y>=0.04] 31 y9 = [i for i, y in enumerate(list_y) if 0.08>=y>=0.06] 32 y10 = [i for i, y in enumerate(list_y) if 0.10>=y>=0.08] 33 34  #それぞれの高さについて、指定した位置の圧力平均をとりモーメント化 35 power1=[] 36 M = [0.01*x for x in range (1,201,2)]#モーメント計算に使用するうでの長さ 37 for h in Z: 38 hani1 = set (h) & set (r) & set (y1) 39 hani2 = set (h) & set (r) & set (y2) 40 hani3 = set (h) & set (r) & set (y3) 41 hani4 = set (h) & set (r) & set (y4) 42 hani5 = set (h) & set(r) & set (y5) 43 hani6 = set (h) & set (r) & set (y6) 44 hani7 = set (h) & set (r) & set (y7) 45 hani8 = set (h) & set (r) & set (y8) 46 hani9 = set (h) & set (r) & set (y9) 47 hani10 = set (h) & set (r) & set (y10) 48 p1 = [list_p[i] for i in hani1] 49 p2 = [list_p[i] for i in hani2] 50 p3 = [list_p[i] for i in hani3] 51 p4 = [list_p[i] for i in hani4] 52 p5 = [list_p[i] for i in hani5] 53 p6 = [list_p[i] for i in hani6] 54 p7 = [list_p[i] for i in hani7] 55 p8 = [list_p[i] for i in hani8] 56 p9 = [list_p[i] for i in hani9] 57 p10 = [list_p[i] for i in hani10] 58 goukei = np.array([sum(p1),sum(p2),sum(p3),sum(p4),sum(p5),sum(p6),sum(p7),sum(p8),sum(p9),sum(p10)]) 59 kazu = np.array([len(p1),len(p2),len(p3),len(p4),len(p5),len(p6),len(p7),len(p8),len(p9),len(p10)]) 60 pp=np.zeros_like(kazu) 61 pp[kazu!=0]=goukei[kazu!=0]/kazu[kazu!=0] 62 ppp=sum(pp) 63 power1.append(ppp) 64 65 moment1 = [x * y for (x, y) in zip(power1, M)] 66  #圧力について面積を考慮せず計算していたため最後に面積をかける 67 mo = sum(moment1)*0.02*0.02*3.14 68 kekka.append(mo) 69#グラフ制作 70plt.plot(kekka) 71plt.title("moment and time") 72plt.xlabel("time[1e-5]") 73plt.ylabel("moment[Nm]") 74plt.show()

これは粒子がある円柱にぶつかるシミュレーションの、円柱周辺のモーメントを計算するというコードで、高さごとにそれぞれの平面的範囲の圧力平均をモーメント計算するというものです。

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

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

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

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

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

guest

回答2

0

条件に沿ってインデックスを取って処理するような部分が多いので、そういうところはnumpyのboolean maskやfancy indexなどで書き換える方針にしてみると良いと思います。

投稿2018/12/05 17:05

編集2018/12/05 17:06
hayataka2049

総合スコア30933

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

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

aine_

2018/12/06 05:08

ありがとうございます。その形式も調べてみます。
guest

0

ベストアンサー

まずは、for, set, list_p, list_yの出現回数が少なくなるようにコードを書き換えるとそれなりに速くなると思いますよ。

投稿2018/12/05 09:32

YouheiSakurai

総合スコア6142

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

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

aine_

2018/12/06 05:08

ありがとうございます。その4つが重いのですね
YouheiSakurai

2018/12/06 06:18

その4つが重いのではなく、同じものが何回も出現するコードは遅くなりがちというか事が言いたかったんです。
aine_

2018/12/06 06:23

なるほど、浅学で申し訳ないです。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問