PyPy Advent Calendar 2011 18日目 PyPyでのライブラリ対応状況を知る
前日の @cocoatomo さんから2週目のバトンを受け取りました。
このエントリは PyPy Advent Calendar 2011 の18日目の記事として書いています.
クリスマスまであと一週間ですね。みなさん、クリスマスの過ごし方は決まりましたか?
今回はPyPyでのライブラリの対応状況を見ていきます。
PyPyでの拡張の対応状況
cPythonとの互換性を見てる感じだとAlpha/beta-levelで CPython C APIをサポートしてますし、
ctypesも今後サポートしてくみたいです。
今後、実装としてのPyPyでは、ライブラリをPythonで書くと速くなる可能性があります。
さて、PyPy 1.7のリリースドキュメントによるとJsonのencodeをPurePythonで書いたら速くなったとのことです。*1
実際にスピードチェックをしてみました。
スピードチェック
※ 環境 MacBookAir CPU: Core2Duo 1.6MHz メモリ:4GB pypyなどはhomebrewで導入
10回の実行での平均値を記録
import time import json # execution runtime per test case TARGET_RUNTIME = 10 EMPTY = ({}, 200000) SIMPLE = ({'key1': 0, 'key2': True, 'key3': 'value', 'key4': 'foo', 'key5': 'string'}, 100000) NESTED = ({'key1': 0, 'key2': SIMPLE[0], 'key3': 'value', 'key4': SIMPLE[0], 'key5': SIMPLE[0], u'key': u'\u0105\u0107\u017c'}, 100000) HUGE = ([NESTED[0]] * 1000, 100) cases = ['EMPTY', 'SIMPLE', 'NESTED', 'HUGE'] def main(n): l = [] for i in range(n): t0 = time.time() for case in cases: data, count = globals()[case] for i in range(count): json.dumps(data) l.append(time.time() - t0) return l if __name__ == '__main__': rtn = main(1) print(rtn)
Python version | time(second) | |
---|---|---|
python2.6.1 | 41.81 | |
python2.7.2 | 7.92 | |
pypy 1.6 | 43.80 | |
pypy 1.7 | 8.16 |
ここによるとPython2.7からsimplejsonのC拡張がonになったみたいですね。
2.7系+C拡張には現状かなわないですが、ほぼ同じような結果が出ているのがわかりますね。
まとめ
今はまだ難しいでしょうが、将来的にはsocketなどのシステムを扱うところ意外は、PurePythonで書くことで処理を早くしていくことができるかもしれません。
PyPyに速さを期待しているみなさんは、PyPyに寄付をして発展に期待しましょう.-)
明日は
明日もお楽しみに!クリスマスまで後7日!
*1:decode? なにそれ、美味しいの?