at_yasu's blog

ロード的なことを

PyPy と Python25 と Python27

なんか最近PyPyがアツいので、ランダム文字列を作製するスクリプトをぶん回して、どれだけ早くやるのかパフォーマンステストをしてみる。決して仕事をする気が無かったわけではない。多分…

ソースはGithubに置いています。

ランダム文字列の作成をひたすらする(1024 * 1024回のループ)という物ですが、幾つかの気になる点があり、2つに分けています。

1. "%c" % (33) と chr(33) の違い
2. 一々printを実行して出力する場合と、buff に出力内容を貯めこんで処理が終わったら出力する方法

そんな訳で、version1 は 1,2 の前半部分を、version 2は 1,2 の後半部分を実行しています。


実行はそれぞれ五回し、それらのデータをGoogle Spreadsheetに放り込んで、ぐちゃぐちゃ平均出したりグラフ化しました。

Version1

atysPy/mksecret.py at master · a-yasui/atysPy · GitHub を各Pythonで実行した結果のグラフと平均数値。

PyPy


ループ回数 平均値
1024 * 1 0.0343562
1024 * 2 0.0409856
1024 * 4 0.0040534
1024 * 8 0.0057876
1024 * 16 0.010769
1024 * 32 0.0338962
1024 * 64 0.0820702
1024 * 128 0.147694
1024 * 256 0.2733152
1024 * 512 0.6933134




Python2.5


ループ回数 平均値
1024 * 1 0.0194546
1024 * 2 0.0148114
1024 * 4 0.0287358
1024 * 8 0.0565998
1024 * 16 0.1143142
1024 * 32 0.234556
1024 * 64 0.4624256
1024 * 128 0.9285392
1024 * 256 1.835507
1024 * 512 3.7459532



Python2.7


ループ回数 平均値
1024 * 1 0.0142612
1024 * 2 0.013326
1024 * 4 0.0276422
1024 * 8 0.0551782
1024 * 16 0.1085156
1024 * 32 0.2178492
1024 * 64 0.4290228
1024 * 128 0.8672428
1024 * 256 1.7547842
1024 * 512 3.541687




Version2

atysPy/mksecret2.py at master · a-yasui/atysPy · GitHub を各Pythonで実行した結果のグラフと平均数値。

PyPy


ループ回数 平均値
1024 * 1 0.015102
1024 * 2 0.0315896
1024 * 4 0.0351068
1024 * 8 0.0047582
1024 * 16 0.011714
1024 * 32 0.0208524
1024 * 64 0.05388
1024 * 128 0.1199696
1024 * 256 0.2579054
1024 * 512 0.8168172




Python2.5


ループ回数 平均値
1024 * 1 0.0067516
1024 * 2 0.013839
1024 * 4 0.02695
1024 * 8 0.052154
1024 * 16 0.1057246
1024 * 32 0.2077588
1024 * 64 0.4151498
1024 * 128 0.8546948
1024 * 256 1.7140588
1024 * 512 3.4095896



Python2.7


ループ回数 平均値
1024 * 1 0.0061324
1024 * 2 0.0120738
1024 * 4 0.0246658
1024 * 8 0.0494102
1024 * 16 0.0988294
1024 * 32 0.2044644
1024 * 64 0.4146738
1024 * 128 0.8462292
1024 * 256 1.7249406
1024 * 512 3.3590644


まとめ

loop count PyPy Version1 PyPy Version2 Python2.5 Version1 Python2.5 Version2 Python2.7 Version1 Python2.7 Version2
1024 * 1 0.0343562 0.015102 0.0194546 0.0067516 0.0142612 0.0061324
1024 * 2 0.0409856 0.0315896 0.0148114 0.013839 0.013326 0.0120738
1024 * 4 0.0040534 0.0351068 0.0287358 0.02695 0.0276422 0.0246658
1024 * 8 0.0057876 0.0047582 0.0565998 0.052154 0.0551782 0.0494102
1024 * 16 0.010769 0.011714 0.1143142 0.1057246 0.1085156 0.0988294
1024 * 32 0.0338962 0.0208524 0.234556 0.2077588 0.2178492 0.2044644
1024 * 64 0.0820702 0.05388 0.4624256 0.4151498 0.4290228 0.4146738
1024 * 128 0.147694 0.1199696 0.9285392 0.8546948 0.8672428 0.8462292
1024 * 256 0.2733152 0.2579054 1.835507 1.7140588 1.7547842 1.7249406
1024 * 512 0.6933134 0.8168172 3.7459532 3.4095896 3.541687 3.3590644

値がごちゃごちゃあってややこしいと自分自身で感じててどうなのよコレと、1024*1 〜 1024*64 までだけグラフ化。


で、面白いのがPyPyは平均して1秒切ってるのに対して、cPythonは見事に跳ね上がっています。





気になったので、グラフ化。

面白い事に、Print を使ったり、"%c"%(33) という文法の方が、buff+='' より早いという結果になっています。多分、メモリー周りなのかしら。



一方で、cPython ではパフォーマンスに大して差がありません。安定してます。






そんなわけで、GoogleSpreadSheetは少しExcelより癖ありますが、使いものになりますよっと。

はてブ米より

id:rokujyouhitoma さんから
> Matplotというのがあってだなぁ。

matplotlibですね、気が向けば使ってみますw

というのも、画像作って保存してフォトライフに保存してそれをダイアリーに貼付けをするって意外と手間なので、spreadsheet を使ったのです。

でもこれはこれで流しこみとかテストに良いです。教えて下さいまして、ありがとうございます。