見出し画像

実行速度の計測 ~numpy~

pythonは計算速度は遅いと聞いたことはあるけど、実際に確認したことはないという方は意外に多いのではないでしょうか。私もnumpyを使えば計算が速くなると聞いたため、ただ使っていました。ここでは簡単な実行例で本当に速いのかを確認してみたいと思います。

予想通りには動かないロボット

コードを書いて実行するときに「一応動くけど動作遅すぎないか?」と思うことはありませんか。

最近、画像処理をして機械学習させて自動で動くロボットを作っているのですが、時間制御したとおりに動かないことが頻繁にあります。

"マイコンの電力不足"や"接続不良"、モータの動力不足などいろんな原因を疑いながら試行錯誤をしていたのですが根本的な原因はコードの実行速度の問題でした。 

実行速度とは

何も考えずにコードを書いても実験の計算を処理したり個人のデータを管理する分にはストレスなく動くと思います。私は無駄のない実行コードなら早く動くと思っていました。

しかし、画像処理や機械学習は多次元の計算を多用するためループを複数回回すしかありませんでした。これは無駄のない計算をしたとしても数千回の計算をしないといけませんでした。

pythonは動的型付け言語であり、c,c++,fortranなどより人間がコードを書きやすい代わりに実行にかかる時間が長くなってしまいます。(このあたりの内容はあまり詳しくないため調べたいと思います。)

つまり、言いたいのはpythonで計算を行うと遅いためほかの言語を用いて計算したいということです。

Numpy

ここで多次元配列や計算を高速化するモジュールがあります。それが"numpy"です。"ndarray(N-dimetional array)"という型を用いて多次元配列を処理するためのモジュールです。私は機械学習をネットサーフィンしながら学んでいたためよくみるモジュールでしたがどれだけ早いのかあまり知らずに使っておりました。しかし、多次元の計算をndarrayにしたらロボットの動きが非常に早くなったため今回どれほど違うのか簡単に比較してみたいと思います。

実行速度の違い ~loop & ndarray~

あまり複雑なコードだと分かりにくくなると思ったため大きさが1億の配列を二つ用意してそれを足した配列を作成するまでの時間で比較したいと思います。なお、実行速度を簡単に測りたかったため Jupyter notebookの%%timeで時間計測しています。一番上の画像のコード(サムネイル)でも時間計測出来ます。

ループによる足し算

%%time
a=list(range(0,100000000,1))
b=list(range(100000000,0,-1))
c=list([0]*10000000)
for i in range(10000000):
   c[i]=a[i]+b[i]

画像1

実行時間は22秒かかりました。体感だと本当に動いているのか不安になりました。

numpyによる計算

%%time
import numpy as np
a=np.arange(0,100000000,1)
b=np.arange(100000000,0,-1)
c=a+b

画像2

実行時間は1.2秒でした。

はっきりと差が出ました。numpyを使わないとロボットはまともに動きませんね。

最後に

同じコードでも環境によって実行時間は変わるますが、ループのほうが速くなることはおそらくないと思います。

あまり詳しくないのですが、for と while では for のほうが実行速度が速いみたいです。

また、計算方法を工夫することで計算回数を少なくすることでもできます。

また、ndarrayを使う際はlistやdictionary,tupleとは演算結果が違うこともあるため(例えば"+"という演算も異なっています。具体的にはndarrayは要素ごとの足し算、list等は要素の追加です。)気を付ける必要があります。


この記事がいろんな方のお役に立てたら幸いです。

この記事が気に入ったらサポートをしてみませんか?