Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Pyconjp2014_implementations

3,868 views

Published on

Introduction to Python Implemetations

Published in: Engineering
  • Be the first to comment

Pyconjp2014_implementations

  1. 1. Pythonの実装系総ざらい
  2. 2. お前誰よ • @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)
  3. 3. PyCon&Singapore&2014でLTしてきました
  4. 4. みなさんの反応
  5. 5. 今年のPyConJPのテーマ
  6. 6. Pythonで再発見
  7. 7. 伝えたいこと • いろんな処理系の紹介 • メリット/デメリットよりも使うシーン • 言葉がたくさん出てくるので名前だけでも覚えていただれば • Python)is)Glue • 用途にあった言語を使おう
  8. 8. 伝えないこと • Pythonの仕様 • 各実装系の細かい仕様の差異 • 実際にどんなところで使われてる?
  9. 9. 今回ご紹介する実装 • CPython(2.X-and-3.X) • Jython • IronPython • PyPy • Pyston
  10. 10. Pythonの特徴かるくまとめ
  11. 11. Pythonとは 1. 広範囲に及ぶ標準ライブラリとサードパーティのモジュール 2. 拡張とモジュールはC/C++で書くのが容易 3. アプリケーションに組み込んでスクリプトインタフェースとし て利用することが可能
  12. 12. クエスチョン 1. C言語より速く動作する? 2. 静的型付け?
  13. 13. GlueとしてのPython
  14. 14. CPython
  15. 15. CPython • CPython2(2.7.8) • CPython3(3.4.1) • Python2プログラミング言語の最も広く用いられている標準の実 装である。2CPython2は2C言語で記述されている。 • Pythonでできないことを、もしくは低レベルコードの高速性が 必要になった場合は、C/C++で拡張モジュールを作成
  16. 16. ctypes !ctypes!は!Python!のための外部関数ライブラリです。このライブ ラリ!は!C!と互換性のあるデータ型を提供し、動的リンク/共有ラ イブラリ内の関数呼び出しを可能にします。動的リンク/共有ライ ブラリを純粋な!Python!でラップするために使うことができます。 from%h'p://docs.python.jp/2/library/ctypes.html
  17. 17.  例!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; }
  18. 18. from ctypes import windll lib = windll.LoadLibrary("dll.dll"); if (lib.__add(1,2) != 3): print("error!") else: print("ok")
  19. 19. 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/
  20. 20. 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!"); }
  21. 21. numpy関連 ちょっとそれるけどnumpyでのスピードアップ用に • numba h(p://numba.pydata.org/ ってのもあります。 バックエンドはLLVMPY h'p://www.llvmpy.org/
  22. 22. 例 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))
  23. 23. cpython3 • C#APIのInterfaceが少し変わった • むしろめんどいのはString/Unicode#=>#Unicode/Byteなところ
  24. 24. って口で言うだけだとあれですね ここでコード例をひとつ 前に自分で書いたやつを見せておきます。 • pyuv Pythonでのlibuvのwrapper1module. asynchronous1I/O1にフォーカスしたマルチプラットフォームライ ブラリでnode.jsで使われてる。
  25. 25. 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
  26. 26. もっと詳しく知りたい方 • Python(インタプリタの拡張と埋め込み h)p://docs.python.jp/3/extending/index.html • Python(3(への拡張モジュール移植 h)p://docs.python.jp/3.4/howto/cpor<ng.html
  27. 27. Jython
  28. 28. Jython 1. h$p://www.jython.org/ 2. 最新は12.5.3/12.5.4rc1/12.71beta3 3. JVM上で動作するPython
  29. 29. Jythonの特徴 • Javaのライブラリが使える.GUIとかも • コンパイル)/)実行という手順を踏まずに、アイデアやAPIの実験 および調査を簡単に実行できる • No)Global)Interpreter)Lock[やばい]
  30. 30. 例:"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
  31. 31. 例:"classpath"の設定 foo.jarを使う $ export CLASSPATH=$CLASSPATH:foo.jar; jython foo.py
  32. 32. invokeDynamic 一言で言うのは難しいんだけどこれに対応してると、JVM上で動 く動的型付け言語でもJavaの呼び出しと同じ最適化をかけてくれ ると思ってください。 言語処理系が自分で最適化ではなく、JVMにお任せできる
  33. 33. 今のところinvokeDynamic対応はまだらしい h"ps://wiki.python.org/jython/RoadMap Towards(v3.3 (Use(of(Java(7(invokedynamic:(Jim?( いつか実装されるのかも
  34. 34. Iron%Python
  35. 35. Iron%Python 1. h$p://ironpython.net/ 2. 最新は02.7.4 3. .NET0Framework0上で動作するPython 4. Python0Tools0fo0VisualStudioで導入できる
  36. 36. DLR • 動的言語を.NET&Framework上に実装するために使われる。 • DLR&は既存のCLRと.NET&Framework仮想マシン上に構築されて いる. • 現在の最新版であるIronPython&2.x系列は.NET&4に対応し、 DLR(動的言語ランタイム)上に実装されている
  37. 37. 例:空のウィンドウ 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
  38. 38. Pythonで書いたんだしこのまま早 くなると言いなぁ
  39. 39. そう思うこと多いよね
  40. 40. ここからははやく動かすのを考えた 処理系の話をしますね
  41. 41. PyPy
  42. 42. 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. セルフホスティング
  43. 43. PyPy#とは? 2つの側面がある 1. インタプリタ型言語のインタプリタを実装するためのツールセット 2. このtoolchainを使用した Python の実装
  44. 44. 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/
  45. 45. 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
  46. 46. いま行われていること 1. PyPy3 2. STM(So,ware1Transac5onal1Memory) GILがとれるかも 3. numpypy
  47. 47. おまけ • PyPy$jaってユーザグループがございます h"ps://groups.google.com/forum/#!forum/pypy4ja
  48. 48. Pyston
  49. 49. Pyston • あのGuidoが所属してるDropboxで作られてる実装 • Python12.X互換(未来のどこかで3.X対応するらしい) • LLVMでビルドしてLLVM1IRに変換して実行 • Unladen1swallowのことは忘れよう • 0.2が昨日出たorz
  50. 50. Pyston • 現状binaryは配られてないので自分でbuild • LLVMからビルドするよ! • LLVM/IRに変換して実行
  51. 51. 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.
  52. 52. 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
  53. 53. v0.3:&current&series • Goal&is&to&improve&performance,&informed&by&our&behavior&on& real&benchmarks.
  54. 54. 速度比較
  55. 55. 速度比較 • Python(v2.7.3 • PyPy(v2.2.1 • Pyston(v0.1(2014/04/15)
  56. 56. 再帰 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)
  57. 57. ループ 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)
  58. 58. One$more$thing...
  59. 59. Pyston'0.2での結果
  60. 60. • Python(v2.7.6 • PyPy(v2.3.1 • Pyston(v0.2(2014/09/11)(new!
  61. 61. (つд⊂)ゴシゴシ→(;゚%Д゚)傾向が変わっていない...
  62. 62. 今後に期待
  63. 63. 組み込み用ではMicroPythonっての がある
  64. 64. この後お話が聞けるので興味のある 方は[Conference)Room)1]へGo!
  65. 65. まとめ • PythonはGlueとして使うと便利 • Pythonの実行を効率化しようとしてる実装は複数存在する • PyPyは楽しいよ • Pystonは今後に期待
  66. 66. Pythonを再発見できたでしょうか?
  67. 67. Ques%on?

×