🤔 PerlとPythonの速さ比べ

2022/07/21

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

参考: JP詰将棋

twitterシェア Facebookシェア

🕍 同じジャンルの最新記事(-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 搭載タブレットがほしかったんですが、満足できる機種が一向に出ず...