読者です 読者をやめる 読者になる 読者になる

Keep on moving

あんまりまとまってないことを書きますよ

PyPy Advent Calendar 2011 18日目 PyPyでのライブラリ対応状況を知る

Advent Calendar 2011 Advent Calendar PyPy

前日の @ さんから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? なにそれ、美味しいの?