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を使って環境構築してみました。
$ 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
こんな感じで、再帰するコードについては高速化が見込めそうということが分かりました。
ループ
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
ループだとPythonより遅いですね。
参考
-
「pypyは本当に速いのか?試してみた」 http://blog.liris.org/2011/05/pypy.html
↑検証コードを参考にさせていただきました。
-
https://tech.dropbox.com/2014/04/introducing-pyston-an-upcoming-jit-based-python-implementation/
-
https://github.com/dropbox/pyston/blob/master/docs/INSTALLING.md
以上。