PerlとPythonの速さ比べ

時間がかかりましたが、Perlで書いていたJS詰将棋をPythonに書き直しました。 この過程でいろいろ学びましたが、作業が終わって一番ビックリしたのが、処理速度の違いです。 Python はやや遅いとは知っていましたが、まさかここまで差がつくとは思いませんでした。 以下は、まいにち詰将棋の5手詰を解かせてみたときの実行速度を比べたものです。 この表の括弧内は、かかった時間がPerlの何倍かを示しています…… と書いているとき、計測方法のミスに気づき、測り直しました😨。
Perl と Python の速度を比較する
問題 | 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 では関数の戻り値を一旦文字列とし、戻り先で配列に戻したりする余分なことをやっていたのを止めたので、少し速くなるだろうとは思っていました……そしてどうやらその通りになったようです。
pypy, numpy について
CPython2,3に比べ、Pypy2はC言語でスピードアップしたモジュールを使用しているとのことで、もう少し速いかと思いましたが、それほどでもありませんでした。 リスト計算の遅さ対策は numpy という科学計算用のパッケージで補えるとのことです。 使ってみましたが、行列だけでなく、1つずつのマスへのアクセスが多いJS将棋でどれだけ高速化メリットを得られるか不明で、中断しています。 また、行列処理を全面的に書き直さないと高速化のメリットも受けられませんし、Pypyは入れただけでは numpy が使えるようになりません。 ただ、Pypyで numpy を使えるようになり、ソースをそれ用に書き直したら、さらに高速化するかもしれないと感じます。
その他気づいた点、感想
その他、Perl のソースを書き直していたときに気づいた点を以下に列挙します。
- Pythonには様々な拡張があり、メジャーな存在なのでネット上のプログラミング参考情報に事欠かない。
- 余分な {} や ; $ がないため、ソースが短く、読みやすい。
- しかし、Pythonは、タブの位置でネストを管理しているため、ちょっとそれがずれると大変なことになる。
- Perlでは変数の数字、文字などの違いを勝手に処理してくれるが、Pythonは明示的にint(x), str(x)などのように型を変換しないとエラーになる。
- Pythonのクラス、関数のスコープがわかりにくい。Perlでは my $x; と書いておくだけで片付いたのが、Python は x に何か代入して初めてその変数のスコープができるので、x は文字か数字かリストか辞書かオブジェクトか、毎回考え、初期化する必要がある。 class や関数の完全なカプセル化が実現しているのか、やや疑問に思える。 今回も最初 class を使うモデルを新たに作ってコーディングしたが、どうしてもカプセル化不良が原因と思えるエラーでうまくいかず、Perl版の書き直しに落ち着いた。
- Pythonは正規表現が扱いにくい。 というか、基本的にフィルタとしてできたPerlは文字列を正規表現に当てはめ、それを処理するという自然な流れがとても書きやすくなっていることに改めて気づく。
皆が Python へ向かっているのは確かなようですが、Perl はテキスト処理、フィルタ処理の部分では一日の長があると思われます。 理想の言語は、シェルマジック的記述を許さないシンプルで、しかも拡張性のあるもので(プログラマ的レガシーの蓄積が可能)、そこにある分野のパッケージを取りこめば必要なスクリプトが簡単に書ける、というものだというのが今回の経験からくる感想です。
参考: JP将棋(旧名 JS将棋)
コメント 記事が気に入ったらいいねしてね!
0
4
🕍 同ジャンル最新記事(-7件)
2021/10/23
2021/10/08
2021/09/29