Pythonの実装系総ざらい
お前誰よ 
• @Masahito 
• P2P,File,Transfer,Engineer,at,Skeed,Co., 
Ltd. 
• I,work,with,Scala,&,JVM(Sorry!) 
• We,use,Python,for,ImplementaJon,the, 
CLI,,and,,to,deploy,the,P2P,client(fabric, 
etc)
PyCon&Singapore&2014でLTしてきました
みなさんの反応
今年のPyConJPのテーマ
Pythonで再発見
伝えたいこと 
• いろんな処理系の紹介 
• メリット/デメリットよりも使うシーン 
• 言葉がたくさん出てくるので名前だけでも覚えていただれば 
• Python)is)Glue 
• 用途にあった言語を使おう
伝えないこと 
• Pythonの仕様 
• 各実装系の細かい仕様の差異 
• 実際にどんなところで使われてる?
今回ご紹介する実装 
• CPython(2.X-and-3.X) 
• Jython 
• IronPython 
• PyPy 
• Pyston
Pythonの特徴かるくまとめ
Pythonとは 
1. 広範囲に及ぶ標準ライブラリとサードパーティのモジュール 
2. 拡張とモジュールはC/C++で書くのが容易 
3. アプリケーションに組み込んでスクリプトインタフェースとし 
て利用することが可能
クエスチョン 
1. C言語より速く動作する? 
2. 静的型付け?
GlueとしてのPython
CPython
CPython 
• CPython2(2.7.8) 
• CPython3(3.4.1) 
• Python2プログラミング言語の最も広く用いられている標準の実 
装である。2CPython2は2C言語で記述されている。 
• Pythonでできないことを、もしくは低レベルコードの高速性が 
必要になった場合は、C/C++で拡張モジュールを作成
ctypes 
!ctypes!は!Python!のための外部関数ライブラリです。このライブ 
ラリ!は!C!と互換性のあるデータ型を提供し、動的リンク/共有ラ 
イブラリ内の関数呼び出しを可能にします。動的リンク/共有ライ 
ブラリを純粋な!Python!でラップするために使うことができます。 
from%h'p://docs.python.jp/2/library/ctypes.html
 例!dllをたたく 
#include "dll.h" 
#include <Windows.h> 
BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpReserved) { 
switch(fdwReason) { 
case DLL_PROCESS_ATTACH: 
break; 
case DLL_THREAD_ATTACH: 
break; 
case DLL_THREAD_DETACH: 
break; 
case DLL_PROCESS_DETACH: 
break; 
} 
return TRUE; 
} 
// 単純な加算。 
DLL_EXPORT int __add(const int x, const int y) { 
return x + y; 
}
from ctypes import windll 
lib = windll.LoadLibrary("dll.dll"); 
if (lib.__add(1,2) != 3): 
print("error!") 
else: 
print("ok")
CPython 
• Python/C*API 
• Pyrex 
h0p://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/ 
• Cython 
h0p://cython.org/ 
• boost.python 
h0p://www.boost.org/doc/libs/1560/libs/python/doc/
Python/C)API 
#include <Python.h> 
static PyObject* helloworld(PyObject* self) 
{ 
return Py_BuildValue("s", "Hello, Python extensions!!"); 
} 
static char helloworld_docs[] = 
"helloworld( ): Any message you want to put here!!n"; 
static PyMethodDef helloworld_funcs[] = { 
{"helloworld", (PyCFunction)helloworld, 
METH_NOARGS, helloworld_docs}, 
{NULL} 
}; 
void inithelloworld(void) 
{ 
Py_InitModule3("helloworld", helloworld_funcs, 
"Extension module example!"); 
}
numpy関連 
ちょっとそれるけどnumpyでのスピードアップ用に 
• numba 
h(p://numba.pydata.org/ 
ってのもあります。 
バックエンドはLLVMPY 
h'p://www.llvmpy.org/
例 
from numba import jit 
from numpy import arange 
# jit decorator tells Numba to compile this function. 
# The argument types will be inferred by Numba when function is called. 
@jit 
def sum2d(arr): 
M, N = arr.shape 
result = 0.0 
for i in range(M): 
for j in range(N): 
result += arr[i,j] 
return result 
a = arange(9).reshape(3,3) 
print(sum2d(a))
cpython3 
• C#APIのInterfaceが少し変わった 
• むしろめんどいのはString/Unicode#=>#Unicode/Byteなところ
って口で言うだけだとあれですね 
ここでコード例をひとつ 
前に自分で書いたやつを見せておきます。 
• pyuv 
Pythonでのlibuvのwrapper1module. 
asynchronous1I/O1にフォーカスしたマルチプラットフォームライ 
ブラリでnode.jsで使われてる。
Python 
#ifdef PYUV_PYTHON3 
static PyModuleDef pyuv_fs_module = { 
PyModuleDef_HEAD_INIT, 
"pyuv.fs", /*m_name*/ 
NULL, /*m_doc*/ 
-1, /*m_size*/ 
FS_methods, /*m_methods*/ 
}; 
#endif 
#ifdef PYUV_PYTHON3 
module = PyModule_Create(&pyuv_fs_module); 
#else 
module = Py_InitModule("pyuv.fs", FS_methods); 
#endif
もっと詳しく知りたい方 
• Python(インタプリタの拡張と埋め込み 
h)p://docs.python.jp/3/extending/index.html 
• Python(3(への拡張モジュール移植 
h)p://docs.python.jp/3.4/howto/cpor<ng.html
Jython
Jython 
1. h$p://www.jython.org/ 
2. 最新は12.5.3/12.5.4rc1/12.71beta3 
3. JVM上で動作するPython
Jythonの特徴 
• Javaのライブラリが使える.GUIとかも 
• コンパイル)/)実行という手順を踏まずに、アイデアやAPIの実験 
および調査を簡単に実行できる 
• No)Global)Interpreter)Lock[やばい]
例:"GUIアプリケーション 
from javax.swing import JButton, JFrame 
frame = JFrame('Hello, Jython!', 
defaultCloseOperation = JFrame.EXIT_ON_CLOSE, 
size = (300, 300) 
) 
def change_text(event): 
print 'Clicked!' 
if __name__=="__main__": 
button = JButton('Click Me!', actionPerformed=change_text) 
frame.add(button) 
frame.visible = True
例:"classpath"の設定 
foo.jarを使う 
$ export CLASSPATH=$CLASSPATH:foo.jar; jython foo.py
invokeDynamic 
一言で言うのは難しいんだけどこれに対応してると、JVM上で動 
く動的型付け言語でもJavaの呼び出しと同じ最適化をかけてくれ 
ると思ってください。 
言語処理系が自分で最適化ではなく、JVMにお任せできる
今のところinvokeDynamic対応はまだらしい 
h"ps://wiki.python.org/jython/RoadMap 
Towards(v3.3 
(Use(of(Java(7(invokedynamic:(Jim?( 
いつか実装されるのかも
Iron%Python
Iron%Python 
1. h$p://ironpython.net/ 
2. 最新は02.7.4 
3. .NET0Framework0上で動作するPython 
4. Python0Tools0fo0VisualStudioで導入できる
DLR 
• 動的言語を.NET&Framework上に実装するために使われる。 
• DLR&は既存のCLRと.NET&Framework仮想マシン上に構築されて 
いる. 
• 現在の最新版であるIronPython&2.x系列は.NET&4に対応し、 
DLR(動的言語ランタイム)上に実装されている
例:空のウィンドウ 
import clr 
clr.AddReferenceByPartialName("System.Windows.Forms") 
clr.AddReferenceByPartialName("System.Drawing") 
import System 
from System.Windows.Forms import Form 
from System.Drawing import Size 
form = Form() 
form.Size = Size(300,200) 
form.Text = "Hello World!" 
System.Windows.Forms.Application.Run(form) 
h"p://www.yasundial.org/ironpython/book.html
Pythonで書いたんだしこのまま早 
くなると言いなぁ
そう思うこと多いよね
ここからははやく動かすのを考えた 
処理系の話をしますね
PyPy
PyPy 
1. h$p://pypy.org/ 
2. the/Python2.7/compa6ble/release/—/PyPy/2.3.1 
3. the/Python3.3/compa6ble/release/—/PyPy3/2.3.1/ 
4. PyPyは、Armin/Rigoが開発した、PythonのJIT特殊化コンパイ 
ラである/Psyco/の後継プロジェクト 
5. Pythonにいくつかの制約を加えた言語であるRPythonで記述 
6. セルフホスティング
PyPy#とは? 
2つの側面がある 
1. インタプリタ型言語のインタプリタを実装するためのツールセット 
2. このtoolchainを使用した Python の実装
toolcahinを利用した他の実装 
• Topaz'(an(implementa/on(of(the(Ruby(programming(language( 
using(PyPy(technology. 
h<ps://github.com/topazproject/topaz 
• HippyVM('(an(implementa/on(of(the(PHP(language(using(PyPy( 
technology. 
h<p://hippyvm.com/
JIT 
• PyPyと言えば速さ 
• Just(In(Time(Compiler 
実行時に処理の流れを解析して最適化,(JSのV8とかのが有名か 
• JIT(document 
h;p://pypy.readthedocs.org/en/latest/jit/ 
• 流行りのJITコンパイラは嫌いですか?( 
h;p://www.longsleeper.com/pypyadvent11
いま行われていること 
1. PyPy3 
2. STM(So,ware1Transac5onal1Memory) 
GILがとれるかも 
3. numpypy
おまけ 
• PyPy$jaってユーザグループがございます 
h"ps://groups.google.com/forum/#!forum/pypy4ja
Pyston
Pyston 
• あのGuidoが所属してるDropboxで作られてる実装 
• Python12.X互換(未来のどこかで3.X対応するらしい) 
• LLVMでビルドしてLLVM1IRに変換して実行 
• Unladen1swallowのことは忘れよう 
• 0.2が昨日出たorz
Pyston 
• 現状binaryは配られてないので自分でbuild 
• LLVMからビルドするよ! 
• LLVM/IRに変換して実行
Roadmap 
v0.1:&released&4/2/2014 
• Focus'was'on'building'and'valida1ng'the'core'Python8to8LLVM' 
JIT'infrastructure. 
• Many'core'parts'of'the'language'were'missing.
v0.2:&released&9/11/2014 
• Many&new&features: 
• Excep3ons 
• Class&inheritance,&metaclasses 
• Basic&na3ve&C&API&support 
• Closures,&generators,&lambdas,&generator&expressions 
• Default&arguments,&keywords,&*args,&**kwargs 
• Longs,&and&integer&promo3on 
Mul3threading&support
v0.3:&current&series 
• Goal&is&to&improve&performance,&informed&by&our&behavior&on& 
real&benchmarks.
速度比較
速度比較 
• 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)
ループ 
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)
One$more$thing...
Pyston'0.2での結果
• Python(v2.7.6 
• PyPy(v2.3.1 
• Pyston(v0.2(2014/09/11)(new!
(つд⊂)ゴシゴシ→(;゚%Д゚)傾向が変わっていない...
今後に期待
組み込み用ではMicroPythonっての 
がある
この後お話が聞けるので興味のある 
方は[Conference)Room)1]へGo!
まとめ 
• PythonはGlueとして使うと便利 
• Pythonの実行を効率化しようとしてる実装は複数存在する 
• PyPyは楽しいよ 
• Pystonは今後に期待
Pythonを再発見できたでしょうか?
Ques%on?

Pyconjp2014_implementations