🤔 PerlとPythonの速さ比べ

2021/10/08

🤔 PerlとPythonの速さ比べ  時間がかかりましたが、Perlで書いていたJS将棋をPythonに書き直しました。 この過程でいろいろ学びましたが、作業が終わって一番ビックリしたのが、処理速度の違いです。 Python はやや遅いとは知っていましたが、まさかここまで差がつくとは思いませんでした。 以下は、まいにち詰将棋の5手詰を解かせてみたときの実行速度を比べたものです。 この表の括弧内は、かかった時間がPerlの何倍かを示しています…… と書いているとき、計測方法のミスに気づき、測り直しました😨。


【まいにち詰将棋の解答速度を比べる】

問題 Perl5 CPython2 CPython3 Pypy2
8/20五手詰 26秒 14秒(0.54) 19秒(0.73) 5秒(0.19)
9/17五手詰 6秒 4秒(0.67) 3秒(0.5) 3秒(0.5)
9/21五手詰 2秒 2秒(1) 2秒(1) 2秒(1)
平均 - -(0.74倍) -(0.74倍) -(0.56倍)

 Ubuntu20.04のデフォルトはCPython2です。 ここに、apt によって、CPython3、pypy を入れて、実行速度を比べてみました。 JS将棋は、パッケージは正規表現くらいしか使わず、主にリストと再帰を使うシンプルな実装なので、書き直しせず、どれでも動きます。

 また、数百行の Perl スクリプトを Python へ書き直しするにあたっては、配列はリストへ、ハッシュは辞書、関数は同名の関数としただけで、その構造はほとんど変えていません。 これだけの差は、したがって、言語の仕様によるものと言えます。 実際のところ、Perl では関数の戻り値を一旦文字列とし、戻り先で配列に戻したりする余分なことをやっていたのを止めたので、少し速くなるだろうとは思っていました……そしてどうやらその通りになったようです。

 CPython2,3に比べ、Pypy2はC言語でスピードアップしたモジュールを使用しているとのことで、もう少し速いかと思いましたが、それほどでもありませんでした。 リスト計算の遅さ対策は numpy という科学計算用のパッケージで補えるとのことです。 使ってみましたが、行列だけでなく、1つずつのマスへのアクセスが多いJS将棋でどれだけ高速化メリットを得られるか不明で、中断しています。 また、行列処理を全面的に書き直さないと高速化のメリットも受けられませんし、Pypyは入れただけでは numpy が使えるようになりません。 ただ、Pypyで numpy を使えるようになり、ソースをそれ用に書き直したら、さらに高速化するかもしれないと感じます。

 その他、Perl のソースを書き直していたときに気づいた点を以下に列挙します。

 皆が Python へ向かっているのは確かなようですが、Perl はテキスト処理、フィルタ処理の部分では一日の長があると思われます。 理想の言語は、シェルマジック的記述を許さないシンプルで、しかも拡張性のあるもので(プログラマ的レガシーの蓄積が可能)、そこにある分野のパッケージを取りこめば必要なスクリプトが簡単に書ける、というものだというのが今回の経験からくる感想です。

参考: JS将棋

twitterシェア Facebookシェア
  コメントの注意点