狠狠撸

狠狠撸Share a Scribd company logo
ヘビはヘビを超えることはできるか ?
PyPyとは? Python で実装された Python 処理系 解釈できる言語は RPython オリジナルの Python にはない様々な機能 処理系全てがPythonで作られている。 パーサ、抽象構文木(AST)、インタプリタ、環境フレームなども Pure Pythonなモジュールも動作実績がある Django, Pylons, BitTorrent, Twisted, SymPy, Pyglet, Nevow, Pinax
こんな感じ #  トレースオプション >>>>  __pytrace__ = 1 Tracing enabled >>>>  a = 1 + 2 |- <<<< enter <inline>a = 1 + 2 @ 1 >>>> |- 0  LOAD_CONST  1 (W_IntObject(3)) |- 3  STORE_NAME  0 (a) |-  hash(W_StringObject('a'))  -> W_IntObject(-468864544) |-  int_w(W_IntObject(-468864544))  -> -468864544 |- 6  LOAD_CONST  0 (<W_NoneObject()>) |- 9  RETURN_VALUE |- <<<< leave <inline>a = 1 + 2 @ 1 >>>>
PyPyとは? Python で実装された Python 処理系 解釈できる言語は RPython オリジナルの Python にはない様々な機能 Python言語のサブセット Restricted Python 一番大きな違いはyieldが使えないこと ジェネレータが使えない http://codespeak.net/pypy/dist/pypy/doc/coding-guide.html
PyPyとは? Python で実装された Python 処理系 解釈できる言語は RPython オリジナルの Python にはない様々な機能 Prologインタプリタ 多様なGC 多種なバックエンド C, CLI, JVM向けのバイナリを出力できる Stackless JIT
JIT
ヘビはヘビを超えることはできるか ? ( 速度的な意味で )
JIT? JIT とは ? PyPy に積まれてる JIT Just In Timeコンパイラ Sun JVMのHotSpotで使われている コードのよく実行される箇所を高速化する 最近だとTraceMonkeyやV8にも使われて話題に
余談(V8のJITについて) http://www.slideshare.net/dynamis/trace-monkey?type=presentation
JIT? JIT とは ? PyPy に積まれてる JIT Tracing JIT Trace Monkeyと同じ手法 バイトコードレベルでよく実行される箇所を検出して、それを最適化する psycoの人が関わってる 関数を超えた最適化も可能 だけど今のPyPyでの実装は、、、
こんな感じ def f(a, b) : if b % 46 == 41: return a - b else: return a + b def strange_sum(n): result = 0 while n >= 0: result = f(result, n) n -= 1 return result   # corresponding trace:   loop_header(result0, n0)   i0 = int_mod(n0, Const(46))   i1 = int_eq(i0, Const(41))   guard_false(i1)   result1 = int_add(result0, n0)   n1 = int_sub(n0, Const(1))   i2 = int_ge(n1, Const(0))   guard_true(i2)   jump(result1, n1)   <= ガード条件に失敗するとインタプリタに戻る <= http://codespeak.net/svn/pypy/extradoc/talk/icooolps2009/bolz-tracing-jit.pdf
こんな感じ class __exten d__(PyFrame): def dispatch(self, pycode, next_instr, ec): next_instr = r_uint(next_instr) try: while True: pypyjitdriver.jit_merge_point( frame=self, ec=ec, next_instr=next_instr, pycode=pycode) co_code = pycode.co_code self.valuestackdepth = hint(self.valuestackdepth, promote=True) next_instr = self.handle_bytecode(co_code, next_instr, ec) except ExitFrame: return self.popvalue() def JUMP_ABSOLUTE(f, jumpto, next_instr, *ignored): ec = f.space.getexecutioncontext() pypyjitdriver.can_enter_jit(frame=f, ec=ec, next_instr=jumpto, pycode=f.getcode()) return jumpto
で、速いの ?
こんな感じらしい
結論 Psyco 最強

More Related Content

Can A Python Go Beyond The Python

  • 2. PyPyとは? Python で実装された Python 処理系 解釈できる言語は RPython オリジナルの Python にはない様々な機能 処理系全てがPythonで作られている。 パーサ、抽象構文木(AST)、インタプリタ、環境フレームなども Pure Pythonなモジュールも動作実績がある Django, Pylons, BitTorrent, Twisted, SymPy, Pyglet, Nevow, Pinax
  • 3. こんな感じ # トレースオプション >>>> __pytrace__ = 1 Tracing enabled >>>> a = 1 + 2 |- <<<< enter <inline>a = 1 + 2 @ 1 >>>> |- 0 LOAD_CONST 1 (W_IntObject(3)) |- 3 STORE_NAME 0 (a) |- hash(W_StringObject('a')) -> W_IntObject(-468864544) |- int_w(W_IntObject(-468864544)) -> -468864544 |- 6 LOAD_CONST 0 (<W_NoneObject()>) |- 9 RETURN_VALUE |- <<<< leave <inline>a = 1 + 2 @ 1 >>>>
  • 4. PyPyとは? Python で実装された Python 処理系 解釈できる言語は RPython オリジナルの Python にはない様々な機能 Python言語のサブセット Restricted Python 一番大きな違いはyieldが使えないこと ジェネレータが使えない http://codespeak.net/pypy/dist/pypy/doc/coding-guide.html
  • 5. PyPyとは? Python で実装された Python 処理系 解釈できる言語は RPython オリジナルの Python にはない様々な機能 Prologインタプリタ 多様なGC 多種なバックエンド C, CLI, JVM向けのバイナリを出力できる Stackless JIT
  • 6. JIT
  • 8. JIT? JIT とは ? PyPy に積まれてる JIT Just In Timeコンパイラ Sun JVMのHotSpotで使われている コードのよく実行される箇所を高速化する 最近だとTraceMonkeyやV8にも使われて話題に
  • 10. JIT? JIT とは ? PyPy に積まれてる JIT Tracing JIT Trace Monkeyと同じ手法 バイトコードレベルでよく実行される箇所を検出して、それを最適化する psycoの人が関わってる 関数を超えた最適化も可能 だけど今のPyPyでの実装は、、、
  • 11. こんな感じ def f(a, b) : if b % 46 == 41: return a - b else: return a + b def strange_sum(n): result = 0 while n >= 0: result = f(result, n) n -= 1 return result # corresponding trace: loop_header(result0, n0) i0 = int_mod(n0, Const(46)) i1 = int_eq(i0, Const(41)) guard_false(i1) result1 = int_add(result0, n0) n1 = int_sub(n0, Const(1)) i2 = int_ge(n1, Const(0)) guard_true(i2) jump(result1, n1) <= ガード条件に失敗するとインタプリタに戻る <= http://codespeak.net/svn/pypy/extradoc/talk/icooolps2009/bolz-tracing-jit.pdf
  • 12. こんな感じ class __exten d__(PyFrame): def dispatch(self, pycode, next_instr, ec): next_instr = r_uint(next_instr) try: while True: pypyjitdriver.jit_merge_point( frame=self, ec=ec, next_instr=next_instr, pycode=pycode) co_code = pycode.co_code self.valuestackdepth = hint(self.valuestackdepth, promote=True) next_instr = self.handle_bytecode(co_code, next_instr, ec) except ExitFrame: return self.popvalue() def JUMP_ABSOLUTE(f, jumpto, next_instr, *ignored): ec = f.space.getexecutioncontext() pypyjitdriver.can_enter_jit(frame=f, ec=ec, next_instr=jumpto, pycode=f.getcode()) return jumpto