Help us understand the problem. What is going on with this article?

[python] pypyで遊んでみる

More than 3 years have passed since last update.

pypy

pypyはpythonを早く実行できるすごいやつ。
今回はpyenvでインストールしたpypy3を使ってみます。

インストール

とりあえずインストールしてみる。

pypy.install
$ pyenv install pypy3-2.4.0
$ pyenv shell pypy3-2.4.0
$ $ pypy
Python 3.2.5 (b2091e973da6, Oct 19 2014, 18:30:58)
[PyPy 2.4.0 with GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.51)] on darwin

入りました、pypy3-2.4.0のpythonのバージョンは3.2.5のようです。

簡単な速度テスト

pypy3-2.4.0とpython3.2.5の速度をとりあえず比較してみます。

簡単なコード、シンプルに$10^{10}$回イテレーションを回してみる

simple_speed_test.py
import time
def time_test(func):
    def _time_test():
        a = time.time()
        func()
        return time.time() - a
    return _time_test

@time_test
def speed_test():
    for _ in range(10**10):
        pass

if __name__ == "__main__":
    print(speed_test())

まず、python3.2.5から

test-1-python3.2.5
$ python --version
Python 3.2.5
$ python speed_test.py 
228.04035305976868 

普通におそいです。
次にpypy3-2.4.0で実行してみます。

test-1-pypy3-2.4.0
$ pypy --version
Python 3.2.5 (b2091e973da6, Oct 19 2014, 18:30:58)
[PyPy 2.4.0 with GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.51)]
$ pypy speed_test.py 
8.809449911117554

すごく早いです。

次に、ファイル読み込みをしてみます。

単純に、csvファイルを一行づつ読みこむだけの作業してみます。
1600000行、200MBのものを読み込んでみます。

speed_test-2.py
@time_test
def load_text():
    for line in open('sample.csv'):
        pass 

if __name__ == '__main__':
  print(load_text())

まず、python3.2.5から、

test-2-python3.2.5
$ python --version
Python 3.2.5
$ python speed_test.py 
0.9221069812774658

結構早いです。。。
次にpypyで実行してみます。

test-2-pypy3-2.4.0
$ pypy --version
Python 3.2.5 (b2091e973da6, Oct 19 2014, 18:30:58)
[PyPy 2.4.0 with GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.51)]
$ pypy speed_test.py 
2.5766420364379883

今度はpypyの方が遅いですね。
こういった処理は苦手なようですね。

まとめ

pypyは単純な計算をするときは早いようです。
自分よりちゃんとテストしてる人がいるので気になる人がいれば参考に
[Python][PyPy]PyPy3 2.4.0を使ってみた

しかし、モジュールが使えない場合があります。
numpy等はこのバージョンでは使えないっぽいです。
2系のpypyではnumpyも使えるようですが、試していません。

頑張れる人は、Cythonで書くのが良いと思います。

Kodaira_
python / rails ruby / 自然言語処理(NLP)をやっています
http://cl.sd.tmu.ac.jp/~kodaira/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away