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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python

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

Q&A

解決済

1回答

2850閲覧

for文を使わないunwrapの方法はありますか?

UMABAY

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python

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

0グッド

0クリップ

投稿2019/04/22 22:28

現在,大量のデータ点数の解析を行っているのですが,unwrapに時間がかかってしまいます.
何かいい方法はありませんか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/04/22 22:32

while 文や、再帰処理でもかけるけど何が知りたいのかな?
UMABAY

2019/04/22 22:48

whileでも早くなるのですか?? すみません.再起処理はあまりわかっていません.. データ点が5000000pointx80くらいあり現在の処理では10[s]x80かかってしまいます.
UMABAY

2019/04/22 22:48

再起処理について教えていただけますか?
t_obara

2019/04/23 01:27

データにもよりますが、キャッシュを試みてはいかがでしょうか。
guest

回答1

0

ベストアンサー

Pythonは動的型付けのインタープリタ言語なので一つ一つの文や式の実行速度はネイティブな機械語で実行されるC言語のようなコンパイラーによるプログラムと比べると大変遅いです。

よって大量のデータに対する単純な繰り返し計算については、Pythonのループではなくネイティブな機械語で実装されたnumpyライブラリーの関数を活用して行うのが高速化の基本的な考え方になると思います。

本件に関していえばnumpyのunwrap関数が活用できると思うのですが・・・質問者さんの実装が不明ですのでPythonのループによる実装とnumpy.unwrapを使った処理の速度を比べてみました。

example.py

Python

1import numpy as np 2from time import perf_counter_ns 3 4unit = np.linspace(0, np.pi * 2, 5, endpoint=False) 5angles = np.block([unit for _ in range(1000000)]) 6 7 8def unwrap1(angles): 9 discont = np.pi 10 res = [] 11 prev_v = angles[0] 12 for v in angles: 13 dv = v - prev_v 14 if dv < 0: 15 dv += np.ceil(-dv / (2 * discont)) * 2 * discont 16 prev_v += dv 17 res.append(prev_v) 18 return res 19 20 21def unwrap2(angles): 22 return np.unwrap(angles) 23 24 25def timeit(exp): 26 t1 = perf_counter_ns() 27 res = eval(exp) 28 t2 = perf_counter_ns() 29 print(f"{exp}: {(t2-t1)/1E9:10.6f}") 30 return res 31 32 33timeit('unwrap1(angles)') 34timeit('unwrap2(angles)')

==>

bash

1$ python3 example.py 2unwrap1(angles): 9.613768 3unwrap2(angles): 0.214240

自分のPCはIntel Core i5-8400 2.8GHzです。

上のサンプルの実行時間を見るに、質問者さんは(細かな違いはあるでしょうが)unwrap1のような計算をしておられるのだろうと想像しました。

同じことをやるのでもnumpy.unwrapなどの関数を利用すれば全然スピードが違うということがわかります。このあたりに着目してご自分の実装を見直してみるとよいのではないでしょうか?

繰り返しになりますが、ポイントはPythonのループ(内包表記等も含む)を用いず、numpyの関数呼び出し(あるいはndarrayの演算)一発でまとめて計算することです。

投稿2019/04/23 03:05

編集2019/04/23 03:09
KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問