LoginSignup
9
9

More than 5 years have passed since last update.

Pyston0.1を動かしてみる

Last updated at Posted at 2014-04-15

Pystonについて

PystonはDropBoxで作成されているPython2.7の互換実装。
LLVMとモダンなJIT技術をつかってパフォーマンスがよくなるように実装が進められているらしい。
詳しくは以下の記事を参照。

 With those caveats, Pyston generally is able to beat CPython’s performance, but still lags behind PyPy.

「CPythonよりはパフォーマンスがよいが、PyPyには及ばない。」

ちなみに、現状ではUbuntu+x86_amd64環境のプラットホームを対象にしてるらしい。

ビルド

現状(2014/4/15時点)だと、バイナリが公開されてないので、自分のところでビルドする必要があります。
以下を参照すれば大体ビルドできます。

ビルド環境

Vagrantを使って環境構築してみました。

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04 LTS"

ビルドの流れ

ほぼドキュメント通りです。

Pystonのコードを取得

githubからコードを取得します

$ sudo apt-get install git
$ cd ~/
$ git clone https://github.com/dropbox/pyston.git

Pystonに依存するものをインストール

$ mkdir ~/pyston_deps

clang用にgccをビルド

$ sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev make build-essential libtool zip gcc-multilib autogen
$ cd ~/pyston_deps
$ wget 'http://www.netgull.com/gcc/releases/gcc-4.8.2/gcc-4.8.2.tar.bz2'
$ tar xvf gcc-4.8.2.tar.bz2
$ mkdir gcc-4.8.2-{build,install}
$ cd gcc-4.8.2-build
$ ../gcc-4.8.2/configure --disable-bootstrap --enable-languages=c,c++ --prefix=$HOME/pyston_deps/gcc-4.8.2-install
$ make -j4
$ make check
$ make install

ccache

$ sudo apt-get install ccache

使わない時には~/pyston/src/Makefile.localに以下の行を追加すること

 USE_CCACHE := 0

LLVMビルドに必要なパッケージを導入

$ sudo apt-get install libncurses5-dev zlib1g-dev

LLVM + clang

$ cd ~/pyston_deps
$ git clone http://llvm.org/git/llvm.git llvm-trunk
$ git clone http://llvm.org/git/clang.git llvm-trunk/tools/clang
$ cd ~/pyston/src
$ make llvm_up
$ make llvm_configure
$ make llvm -j4

libunwind

$ cd ~/pyston_deps
$ wget http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz
$ tar xvf libunwind-1.1.tar.gz
$ mkdir libunwind-1.1-install
$ cd libunwind-1.1
$ ./configure --prefix=$HOME/pyston_deps/libunwind-1.1-install --enable-shared=0
$ make -j4
$ make install
$ ldconfig

valgrind

Installドキュメントによると、aptだと古いので、ソースからビルドしよう的なことが書いてあるので、
素直にソースから入れます。

$ cd ~/pyston_deps
$ wget http://valgrind.org/downloads/valgrind-3.9.0.tar.bz2
$ tar xvf valgrind-3.9.0.tar.bz2
$ mkdir valgrind-3.9.0-install
$ cd valgrind-3.9.0
$ ./configure --prefix=$HOME/pyston_deps/valgrind-3.9.0-install
$ make -j4
$ make install
$ sudo apt-get install libc6-dbg

その後、~/pyston/src/Makefile.localを編集します

VALGRIND := VALGRIND_LIB=$(HOME)/pyston_deps/valgrind-3.9.0-install/lib/valgrind $(HOME)/pyston_deps/valgrind-3.9.0-install/bin/valgrind

Optional dependenciesについては、Readme.mdに動かす分には飛ばしていいと書いてあるのでここでは省きます

(やっと)Pystonのビルド

$ cd ~/pyston/src
$ make check -j4

テストがいろいろ走ります。
無事テストが通ると、バイナリができます。お疲れ様でした。

$ ls ~/pyston/src/pyston*
/home/vagrant/pyston/src/pyston
/home/vagrant/pyston/src/pyston_prof
/home/vagrant/pyston/src/pyston_dbg

起動方法

$ ./pyston
  1.9ms to load stdlib
 4.3ms for initCodegen
4.5ms for jit startup
Pyston v0.1, rev 1fe94923ff6f
>>

Pyston0.1ではVervoseモードが標準になっているので、LLVMへのビルドの過程に興味がある方以外は"q(quiet)"オプションをつけてやりましょう。

$ ./pyston -q
>>

"i"オプションでファイルをREPLに対して読み込みます。
ちなみにファイルが~/pyston/srcにないと読み込めません(Segmentation faultで落ちる)。

$ ./pyston -iq hello.py
Hello Pyston v0.1
Pyston v0.1, rev 1fe94923ff6f
>>
print("Hello Pyston v0.1")

ファイルからの実行も可能です。

$ ./pyston -q hello.py
Hello Pyston v0.1

もっと細かい話についてはこちらを参照してください。

注意点

  • REPLで改行すると落ちます
  • 現状だとライブラリはほとんど実装されていません。いまのところtime.timeくらいしか使えません。
  • Pythonの基礎文法以外はほとんど実装されていません。実装されていない機能はつかうと落ちます。 https://github.com/dropbox/pyston/blob/master/README.md#v01-422014
  • もちろんリスト内包とかも動きません。

ここまで見てがっかりしなかった方、続きを読んでください。

で、本当に速いの?

ということで、パフォーマンスチェックをしてみました。
比較するのは以下の様な感じです

  • Python v2.7.3
  • PyPy v2.2.1
  • Pyston v0.1(2014/04/15)

再帰

import time

def fib(n):
    if n < 2: return n
    return fib(n - 2) + fib(n - 1)

if __name__ == "__main__":
    for x in range(3):
        fib(3)

    start = time.time()
    result = fib(38)
    timespan = time.time() - start
    print(result)
    print (timespan)

Python v2.7.3

$ python -i fib.py
39088169
11.7266070843

PyPy v2.2.1

$ ~/pypy-2.2.1-linux64/bin/pypy -i fib.py
39088169
2.00477910042

Pyston v0.1

$ cd ~/pyston/src
$ ./pyston -iq fib.py
39088169
1.37748503685

rec.png

こんな感じで、再帰するコードについては高速化が見込めそうということが分かりました。

ループ

import time

def fib(n):
    value = 0
    f1, f2 = 1, -1
    for i in range(n+1):
        value = f1 + f2
        f2 = f1
        f1 =value

    return value

if __name__ == "__main__":
    for x in range(3):
        fib(3)

    start = time.time()
    result = 0
    for x in range(0,5000):
        result = fib(38)
    timespan = time.time() - start
    print(result)
    print (timespan)

Python v2.7.3

$ python -i fib_loop.py
39088169
0.0174479484558

PyPy v2.2.1

$ ~/pypy-2.2.1-linux64/bin/pypy -i fib_loop.py
39088169
0.0166938304901

Pyston v0.1

$ cd ~/pyston/src
$ ./pyston -iq fib.py
39088169
0.0527310371399

loop.png

ループだとPythonより遅いですね。

参考

↑検証コードを参考にさせていただきました。

以上。

9
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9