hiibii.net

MENU

【Python】書き直したら実行スピードが100倍になった話

\ シェアする /

どうも。ヒビ(@hiibii256)です。

先週に引き続き、データ分析のコンペティションに参加しております。7月はコンペティションと学期末のテスト、レポートで卒倒しそうです(´-ω-`)

先週は、データ分析に5時間かかってしまい、散々でした。

このまま終われねえよなあ!?

メモリを少なくして人間の負担を減らす

ひとつのプログラムを実行して、結果が得られるまでに5時間。5時間コンピュータが専用機になるかどうかはメモリ次第。

具体的には、メモリの使用割合が大事!!

メモリをあまり使わずに済むプログラムなら、まだいいんです。ネットサーフィンしながらだったり、別のプログラムを書きながらだったり。

しかし、メモリの使用割合が高いと、使用しているコンピュータがそのプログラム実行専用機となってしまいます。そのほかのアプリケーションを使おうにもカックカク。

じゃあ、メモリを少なく済ますには?

いろいろやり方はありますが、なんといっても変数の量を減らすこと!

  • 必要ない変数はつくらない
  • いらないときは、リストの中身を空にする
  • ループを駆使して上書きできる変数を増やす

具体的にはこんな感じ。

流石に専用機は辛いですよね(^^;)

ライブラリを使ってスピードアップ

データ分析、人工知能にはPython。しかし、先週もお話したように、Pythonは決して速い言語ではありません。むしろ、激遅です。

先週はスピードを無視したプログラムを書いていました。(というより、無視したものしか書けなかった)

今週はスピードを考えてプログラムを書き直しました。どう書き換えたか?

ズバリ、Numpyです!

なーんだという人もいれば、何それ?と思う人もいるでしょう。

NumpyはPythonのライブラリ(モジュールと呼ぶべきなのか?)のひとつ。padasなどと並んで数値処理をする際に欠かせないのです!

なぜ、Numpyを使うとスピードかアップするのか?

その答えは型とC言語にあります。

型が決まっていないということ

Pythonには型の指定がありません。型の指定がないぶん、書きやすくなっています。

ただ、スピードの面から見るとこの型の指定がないということは最悪です。

それは、計算時にコンピュータが自動的に調整しなければならないからです。

10と1.5の加算をとるとき、コンピュータは型の指定がないため、10.0になおしてから1.5と計算します。この10から10.0にすることに、僅かな時間を要するのです。

塵も積もれば山となるというように、この僅かな時間が何万、何十万、何百万も積もれば恐ろしいことになってしまうわけです。

速い言語に頼るべし

Pythonそのものは、どう足掻いてもC言語やC++ほどのスピードを出せません。

だったら、他の言語に頼ればいいじゃない!

NumpyはC言語によって最適化されているため、Pythonのライブラリでありながら、Cの恩恵を受けられます。

もちろん、プログラマーはCを知らなくても、使いこなせなくても、大丈夫です!

結果としては…

結果としては、スピードが100倍になりました。

5時間(300分)かかっていたものが3分で済みました。

メモリも20%ほど減らすことができましたが、実行時間が短くなりすぎて、あまり実感はないです笑

ネットサーフィンする暇さえも与えないレベル。先週の自分が馬鹿みたい…。

コンペティション最後まで頑張るぞー!