Pyston0.1を動かしてみる

# Pystonについて

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

* https://tech.dropbox.com/2014/04/introducing-pyston-an-upcoming-jit-based-python-implementation/
* http://news.mynavi.jp/news/2014/04/11/041/

```
 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時点)だと、バイナリが公開されてないので、自分のところでビルドする必要があります。
以下を参照すれば大体ビルドできます。

* https://github.com/dropbox/pyston/blob/master/README.md
* https://github.com/dropbox/pyston/blob/master/docs/INSTALLING.md

## ビルド環境

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

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

## ビルドの流れ

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


### Pystonのコードを取得

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

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

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

```shell-session
$ mkdir ~/pyston_deps
```

#### clang用にgccをビルド

```shell-session
$ 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

```shell-session
$ sudo apt-get install ccache
```

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

```
 USE_CCACHE := 0
```

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

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

#### LLVM + clang

```shell-session
$ 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

```shell-session
$ 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だと古いので、ソースからビルドしよう的なことが書いてあるので、
素直にソースから入れます。

```shell-session
$ 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のビルド

```shell-session
$ cd ~/pyston/src
$ make check -j4
```

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

```shell-session
$ ls ~/pyston/src/pyston*
/home/vagrant/pyston/src/pyston
/home/vagrant/pyston/src/pyston_prof
/home/vagrant/pyston/src/pyston_dbg
```


# 起動方法

```shell-session
$ ./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)"オプションをつけてやりましょう。

```shell-session
$ ./pyston -q
>>
```

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

```shell-session
$ ./pyston -iq hello.py
Hello Pyston v0.1
Pyston v0.1, rev 1fe94923ff6f
>>
```

```py
print("Hello Pyston v0.1")
```

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

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

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

https://github.com/dropbox/pyston/blob/master/README.md#command-line-options

## 注意点

* 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)

## 再帰

```py
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

```shell-session
$ python -i fib.py
39088169
11.7266070843
```


### PyPy v2.2.1

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

### Pyston v0.1

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

![rec.png](https://qiita-image-store.s3.amazonaws.com/0/38327/3337bfba-9884-307b-2298-172a75be1f19.png)


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

## ループ

```py
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

```shell-session
$ python -i fib_loop.py
39088169
0.0174479484558
```


### PyPy v2.2.1

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

### Pyston v0.1

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

![loop.png](https://qiita-image-store.s3.amazonaws.com/0/38327/fcb47a4a-d4a6-7bfd-44bd-7d62ab07d16c.png)


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

# 参考

* 「pypyは本当に速いのか？試してみた」 http://blog.liris.org/2011/05/pypy.html

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

* https://tech.dropbox.com/2014/04/introducing-pyston-an-upcoming-jit-based-python-implementation/
* http://news.mynavi.jp/news/2014/04/11/041/
* https://github.com/dropbox/pyston/blob/master/README.md
* https://github.com/dropbox/pyston/blob/master/docs/INSTALLING.md


以上。