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

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

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

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

Python

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

Q&A

解決済

2回答

3019閲覧

Python for文 処理速度 処理時間

purogutamu

総合スコア17

for

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

Python

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

0グッド

0クリップ

投稿2021/11/19 09:16

Pythonで、音声波形のDPマッチングを実装しようとしているのですが、処理時間が長すぎるので、助けてください。

処理時間が長い原因が二重for文です。以下は例ですが、

python

1for i in range(8000): 2 for j in range(3000): 3 DPマッチングの累積コストなどを計算

のようなfor文を使っています。
上の二重for文は、サンプリング周波数1000で、8秒の音源と3秒の音源とした時のものですが、実際にはサンプリング周波数も大きくして、音源も長くしたいです。

自分のノートPCでは全然ダメだと思い、Google Colab のGPUを使って(pytorchを使用して)、実行してみたのですが、30分以上もかかりました(途中で止めた)。

調べてみたところpythonのfor文は遅いということなのですが、累積コストを計算するために、順番に実装することが必須です。

何か良い案、方法はありますか?
ちなみに、プログラム自体は、とても短い配列でDPマッチングを実行することができたので、プログラムに欠陥(永遠にfor文が回っているなど)は無いと思います。

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

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

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

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

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

bsdfan

2021/11/19 14:51

1回の「DPマッチングの累積コストなどを計算」にかかる時間を計測してみてはどうでしょう。 最低でも、それと回数をかけた時間がかかることになります。 それが大きい数字ならforループを工夫しても限界があります。
guest

回答2

0

ベストアンサー

for文の中身がNumpyの簡単な処理でできているのであれば、from numba import jitと@jitのおまじないで片付く可能性があります。


もし、@jitでエラーが出る場合には、@jit(nopython=True)に変更ください。
Numpyの簡単な処理(シンプルな関数)で処理できる場合にはエラーが出ませんが、複雑な関数が使われていたりNumpyの外側の処理が挟まるとエラーが起きます。そのエラーの回避策が上のnopythonの引数です。

いやいやそんな、CPUなんざ興味ありませんぜ。本命はGPUでござんす。という場合にはCUDA対応のjitを使ってください。
※GPUは確かに早いですがCPU<-->GPUのデータ移動のオーバーヘッドがバカになりません。計算対象があまりに小さいようであればCPUの方が早いこともあり得ます。また、CPU<-->GPUのデータ移動は最小限になるように工夫が必要(forで回すたびに都度CPU側からGPU側に移して捌いてCPUに戻すのではなく、forの外側でCPU側からGPU側に一気に引っ越して、GPU側で捌いた結果だけCPU側に戻す)です。

投稿2021/11/19 13:14

編集2021/11/19 23:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

purogutamu

2021/11/20 04:01

numbaを使ってみると、40倍近く高速になって驚きました....しかし、色々と使うにも制限があり、扱いづらそうですが、ありがとうございます。 numpyの内包表記やスライスなどを駆使して、より高速化を目指します。
退会済みユーザー

退会済みユーザー

2021/11/20 07:55

windowsPCであれば@jit(nopython=True)で大概の問題は回避できますが、Linuxだと何が違うのか@jit(nopython=True)が通用しなくなるのでちょっとめんどくさいですよね。
guest

0

DPマッチングの累積コストなどを計算

で何をやっているかによります。

numpyに入れてSIMD命令を使えるような演算に書き換えることができれば高速化します。
うまくいくかいかないかは、やっていること次第です。

NumPyをよく読んで勉強して下さい。

投稿2021/11/19 09:41

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問