🤔 PerlとPythonの速さ比べ
2022/07/21
Perlで書いていたJS将棋(JP詰将棋の旧版)をPythonに書き直した時のメモです。
以下は、まいにち詰将棋の5手詰を解かせたときの実行速度を比べたものです。
作業が終わって一番ビックリしたのは、処理速度の違いです。
Python はやや遅いとは知っていましたが、
まさかここまで差がつくとは。
この表の括弧内は、かかった時間が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には様々な拡張があり、 メジャーな存在なのでネット上のプログラミング参考情報に事欠かない。
- 余分な {} や ; $ がないため、ソースが短く、読みやすい。
- しかし、Pythonは、タブの位置でネストを管理しているため、 ちょっとそれがずれると大変なことになる。
- Perlでは変数の数字、文字などの違いを勝手に処理してくれるが、 Pythonは明示的にint(x), str(x)などのように型を変換しないとエラーになる。
- Pythonのクラス、関数のスコープがわかりにくい。 Perlでは my $x; と書いておくだけで片付いたのが、 Python は x に何か代入して初めてその変数のスコープができるので、 x は文字か数字かリストか辞書かオブジェクトか、毎回考え、初期化する必要がある。 class や関数の完全なカプセル化が実現しているのか、やや疑問に思える。 今回も最初 class を使うモデルを新たに作ってコーディングしたが、 どうしてもカプセル化不良が原因と思えるエラーでうまくいかず、 Perl版の書き直しに落ち着いた。
- Pythonは正規表現が扱いにくい。 というか、基本的にフィルタとしてできたPerlは文字列を正規表現に当てはめ、 それを処理するという自然な流れが とても書きやすくなっていることに改めて気づく。
皆が Python へ向かっているのは確かなようですが、 Perl はテキスト処理、フィルタ処理の部分では一日の長があると思われます。 理想の言語は、シェルマジック的記述を許さないシンプルで、 しかも拡張性のあるもので(プログラマ的レガシーの蓄積が可能)、 そこにある分野のパッケージを取りこめば必要なスクリプトが簡単に書ける、 というものだというのが今回の経験からくる感想です。
参考: JP詰将棋
![]() | ![]() |
🕍 同じジャンルの最新記事(-5件)
![]() | Javascriptで詰将棋を解く(2023/03/15) 今回、詰将棋の Python コードを Javascript に移植し、相当なスピードアップを達成しました... |
![]() | NTT光でVPN(2022/07/27) NTT光接続でつないでいる場合、デフォルトのゲートウェイ機で VPN できちゃいます。その具体的なプロセスです... |
![]() | 動画の広告カット(2022/07/26) 広告をカットしたり、前後の不要部分を削除したりしたい場合、簡単で、安全にできるソフトに kdenlive があります... |
![]() | Python速度アップ考(2022/07/23) Learnig Pythonの中で Pypy の速さに触れていますが、自分でも調べてみようと思い、本では触れられていない、Pypy での結果に加え、numpy, Cython, cupy でも計測して.. |
![]() | Chromebook雑感(2022/07/22) 主に自宅WiFi内、外出時にVPNで自宅LANにつなぐサブ機として購入しました。本当は Ubuntu 搭載タブレットがほしかったんですが、満足できる機種が一向に出ず... |