0
ヘビはヘビを超えることはできるか ?
PyPyとは? <ul><li>Python で実装された Python 処理系 </li></ul><ul><li>解釈できる言語は RPython </li></ul><ul><li>オリジナルの Python にはない様々な機能 </li...
こんな感じ #  トレースオプション >>>>  __pytrace__ = 1 Tracing enabled >>>>  a = 1 + 2 |- <<<< enter <inline>
a = 1 + 2 @ 1 >>>> |- 0  L...
PyPyとは? <ul><li>Python で実装された Python 処理系 </li></ul><ul><li>解釈できる言語は RPython </li></ul><ul><li>オリジナルの Python にはない様々な機能 </li...
PyPyとは? <ul><li>Python で実装された Python 処理系 </li></ul><ul><li>解釈できる言語は RPython </li></ul><ul><li>オリジナルの Python にはない様々な機能 </li...
JIT
ヘビはヘビを超えることはできるか ? ( 速度的な意味で )
JIT? <ul><li>JIT とは ? </li></ul><ul><li>PyPy に積まれてる JIT </li></ul><ul><li>Just In Timeコンパイラ </li></ul><ul><li>Sun JVMのHotS...
余談(V8のJITについて) http://www.slideshare.net/dynamis/trace-monkey?type=presentation
JIT? <ul><li>JIT とは ? </li></ul><ul><li>PyPy に積まれてる JIT </li></ul><ul><li>Tracing JIT </li></ul><ul><ul><li>Trace Monkeyと同...
こんな感じ 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 =...
こんな感じ class __exten d__(PyFrame): def dispatch(self, pycode, next_instr, ec): next_instr = r_uint(next_instr) try: while T...
で、速いの ?
こんな感じらしい
結論 Psyco 最強
Upcoming SlideShare
Loading in...5
×

Can A Python Go Beyond The Python

1,582

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,582
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Can A Python Go Beyond The Python"

  1. 1. ヘビはヘビを超えることはできるか ?
  2. 2. PyPyとは? <ul><li>Python で実装された Python 処理系 </li></ul><ul><li>解釈できる言語は RPython </li></ul><ul><li>オリジナルの Python にはない様々な機能 </li></ul><ul><li>処理系全てがPythonで作られている。 </li></ul><ul><ul><li>パーサ、抽象構文木(AST)、インタプリタ、環境フレームなども </li></ul></ul><ul><li>Pure Pythonなモジュールも動作実績がある </li></ul><ul><ul><li>Django, Pylons, BitTorrent, Twisted, SymPy, Pyglet, Nevow, Pinax </li></ul></ul>
  3. 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. 4. PyPyとは? <ul><li>Python で実装された Python 処理系 </li></ul><ul><li>解釈できる言語は RPython </li></ul><ul><li>オリジナルの Python にはない様々な機能 </li></ul><ul><li>Python言語のサブセット </li></ul><ul><ul><li>Restricted Python </li></ul></ul><ul><li>一番大きな違いはyieldが使えないこと </li></ul><ul><ul><li>ジェネレータが使えない </li></ul></ul><ul><li>http://codespeak.net/pypy/dist/pypy/doc/coding-guide.html </li></ul>
  5. 5. PyPyとは? <ul><li>Python で実装された Python 処理系 </li></ul><ul><li>解釈できる言語は RPython </li></ul><ul><li>オリジナルの Python にはない様々な機能 </li></ul><ul><li>Prologインタプリタ </li></ul><ul><li>多様なGC </li></ul><ul><li>多種なバックエンド </li></ul><ul><ul><li>C, CLI, JVM向けのバイナリを出力できる </li></ul></ul><ul><li>Stackless </li></ul><ul><li>JIT </li></ul>
  6. 6. JIT
  7. 7. ヘビはヘビを超えることはできるか ? ( 速度的な意味で )
  8. 8. JIT? <ul><li>JIT とは ? </li></ul><ul><li>PyPy に積まれてる JIT </li></ul><ul><li>Just In Timeコンパイラ </li></ul><ul><li>Sun JVMのHotSpotで使われている </li></ul><ul><ul><li>コードのよく実行される箇所を高速化する </li></ul></ul><ul><li>最近だとTraceMonkeyやV8にも使われて話題に </li></ul>
  9. 9. 余談(V8のJITについて) http://www.slideshare.net/dynamis/trace-monkey?type=presentation
  10. 10. JIT? <ul><li>JIT とは ? </li></ul><ul><li>PyPy に積まれてる JIT </li></ul><ul><li>Tracing JIT </li></ul><ul><ul><li>Trace Monkeyと同じ手法 </li></ul></ul><ul><ul><li>バイトコードレベルでよく実行される箇所を検出して、それを最適化する </li></ul></ul><ul><ul><li>psycoの人が関わってる </li></ul></ul><ul><ul><li>関数を超えた最適化も可能 </li></ul></ul><ul><ul><ul><li>だけど今のPyPyでの実装は、、、 </li></ul></ul></ul>
  11. 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 <ul><li># corresponding trace: </li></ul><ul><li>loop_header(result0, n0) </li></ul><ul><li>i0 = int_mod(n0, Const(46)) </li></ul><ul><li>i1 = int_eq(i0, Const(41)) </li></ul><ul><li>guard_false(i1) </li></ul><ul><li>result1 = int_add(result0, n0) </li></ul><ul><li>n1 = int_sub(n0, Const(1)) </li></ul><ul><li>i2 = int_ge(n1, Const(0)) </li></ul><ul><li>guard_true(i2) </li></ul><ul><li>jump(result1, n1) </li></ul><= ガード条件に失敗するとインタプリタに戻る <= http://codespeak.net/svn/pypy/extradoc/talk/icooolps2009/bolz-tracing-jit.pdf
  12. 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
  13. 13. で、速いの ?
  14. 14. こんな感じらしい
  15. 15. 結論 Psyco 最強
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×