PyPy 1.2: snakes never crawled so fast
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

PyPy 1.2: snakes never crawled so fast

  • 2,845 views
Uploaded on

Antonio Cuni, Armin Rigo ...

Antonio Cuni, Armin Rigo

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,845
On Slideshare
2,845
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
29
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. PyPy 1.2: snakes never crawled so fast Antonio Cuni Armin Rigo Pycon Italia Qu4ttro May 8 2010 antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 1 / 35
  • 2. Outline PyPy 1.2: what’s new and status update Overview of the JIT Demo: how to use PyPy right now antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 1 / 35
  • 3. Part 0: What is PyPy? :-) Python interpreter written in Python Framework for developing dynamic languages etc. etc. From the user point of view An alternative to CPython with more features! antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 2 / 35
  • 4. Part 0: What is PyPy? :-) Python interpreter written in Python Framework for developing dynamic languages etc. etc. From the user point of view An alternative to CPython with more features! antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 2 / 35
  • 5. Part 1 What’s new and status update antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 3 / 35
  • 6. What’s new in PyPy 1.2 Released on March 12th, 2010 Main theme: speed JIT compiler speed.pypy.org Ubuntu packages antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 4 / 35
  • 7. Speed: PyPy vs CPython antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 5 / 35
  • 8. Speed: PyPy vs Psyco antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 6 / 35
  • 9. Speed: Demo Django application Mandelbrot fractal fished randomly on the net :-) Run both on CPython and PyPy django trunk! antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 7 / 35
  • 10. What works on PyPy Pure Python modules should Just Work (TM) django trunk twisted, nevow pylons bittorrent ... lot of standard modules __builtin__ __pypy__ _codecs _lsprof _minimal_curses _random _rawffi _socket _sre _weakref bz2 cStringIO crypt errno exceptions fcntl gc itertools marshal math md5 mmap operator parser posix pyexpat select sha signal struct symbol sys termios thread time token unicodedata zipimport zlib array binascii cPickle cmath collections ctypes datetime functools grp md5 pwd pyexpat sha sqlite3 syslog ctypes antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 8 / 35
  • 11. What works on PyPy Pure Python modules should Just Work (TM) django trunk twisted, nevow pylons bittorrent ... lot of standard modules __builtin__ __pypy__ _codecs _lsprof _minimal_curses _random _rawffi _socket _sre _weakref bz2 cStringIO crypt errno exceptions fcntl gc itertools marshal math md5 mmap operator parser posix pyexpat select sha signal struct symbol sys termios thread time token unicodedata zipimport zlib array binascii cPickle cmath collections ctypes datetime functools grp md5 pwd pyexpat sha sqlite3 syslog ctypes antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 8 / 35
  • 12. What does not work on PyPy Pure Python modules should Just Work (TM) ... unless they don’t :-) Programs that rely on CPython-specific behavior refcounting: open(’xxx’, ’w’).write(’stuff’) non-string keys in dict of types (try it!) exact naming of a list comprehension variable exact message matching in exception catching code ... Extension modules really? drum roll... antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 9 / 35
  • 13. What does not work on PyPy Pure Python modules should Just Work (TM) ... unless they don’t :-) Programs that rely on CPython-specific behavior refcounting: open(’xxx’, ’w’).write(’stuff’) non-string keys in dict of types (try it!) exact naming of a list comprehension variable exact message matching in exception catching code ... Extension modules really? drum roll... antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 9 / 35
  • 14. What does not work on PyPy Pure Python modules should Just Work (TM) ... unless they don’t :-) Programs that rely on CPython-specific behavior refcounting: open(’xxx’, ’w’).write(’stuff’) non-string keys in dict of types (try it!) exact naming of a list comprehension variable exact message matching in exception catching code ... Extension modules really? drum roll... antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 9 / 35
  • 15. What does not work on PyPy Pure Python modules should Just Work (TM) ... unless they don’t :-) Programs that rely on CPython-specific behavior refcounting: open(’xxx’, ’w’).write(’stuff’) non-string keys in dict of types (try it!) exact naming of a list comprehension variable exact message matching in exception catching code ... Extension modules really? drum roll... antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 9 / 35
  • 16. What does not work on PyPy Pure Python modules should Just Work (TM) ... unless they don’t :-) Programs that rely on CPython-specific behavior refcounting: open(’xxx’, ’w’).write(’stuff’) non-string keys in dict of types (try it!) exact naming of a list comprehension variable exact message matching in exception catching code ... Extension modules really? drum roll... antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 9 / 35
  • 17. cpyext CPython extension modules in PyPy pypy-c setup.py build still beta not 100% of CPython API is supported not included in PyPy 1.2 Known to work: wxPython (after a patch) _sre PyCrypto PIL antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 10 / 35
  • 18. wxPython on PyPy (1) antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 11 / 35
  • 19. wxPython on PyPy (2) antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 12 / 35
  • 20. PyPy 1.2.1 Coming soon Many bugfixes 27 issues reported after release of 1.2 beta version of cpyext antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 13 / 35
  • 21. Part 2: Just-in-Time compilation Snakes never crawled so fast antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 14 / 35
  • 22. Overview of implementations CPython Stackless Psyco Jython IronPython PyPy (without and with JIT) Unladen Swallow antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 15 / 35
  • 23. Demo antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 16 / 35
  • 24. Features it just works it may give good speed-ups (better than Psyco) it may have a few bugs left (Psyco too) it is not a hack (unlike Psyco) PyPy also has excellent memory usage half that of CPython for a program using several hunderds MBs antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 17 / 35
  • 25. Features it just works it may give good speed-ups (better than Psyco) it may have a few bugs left (Psyco too) it is not a hack (unlike Psyco) PyPy also has excellent memory usage half that of CPython for a program using several hunderds MBs antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 17 / 35
  • 26. Features it just works it may give good speed-ups (better than Psyco) it may have a few bugs left (Psyco too) it is not a hack (unlike Psyco) PyPy also has excellent memory usage half that of CPython for a program using several hunderds MBs antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 17 / 35
  • 27. What is a JIT CPython compiles the program source into bytecodes without a JIT, the bytecodes are then interpreted with a JIT, the bytecodes are further translated to machine code (assembler) antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 18 / 35
  • 28. What is a JIT (2) The translation can be: syntactic: translate the whole functions into machine code “the obvious way” e.g. Pyrex/Cython, Unladen Swallow not good performance, or needs tricks semantic: translate bits of the function just-in-time only used parts exploit runtime information (e.g. types) Psyco, PyPy antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 19 / 35
  • 29. What is a JIT (2) The translation can be: syntactic: translate the whole functions into machine code “the obvious way” e.g. Pyrex/Cython, Unladen Swallow not good performance, or needs tricks semantic: translate bits of the function just-in-time only used parts exploit runtime information (e.g. types) Psyco, PyPy antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 19 / 35
  • 30. What is a tracing JIT start by interpreting normally find loops as they are executed turn them into machine code 80% of the time is spent in 20% of the code antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 20 / 35
  • 31. What is a tracing JIT (history) tracing assembler (Dynamo, ~2000) tracing Java (~2005) tracing JavaScript (~2008) PyPy is a “tracing JIT generator” antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 21 / 35
  • 32. What is a tracing JIT (history) tracing assembler (Dynamo, ~2000) tracing Java (~2005) tracing JavaScript (~2008) PyPy is a “tracing JIT generator” antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 21 / 35
  • 33. The architecture of PyPy antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 22 / 35
  • 34. Speed of the PyPy JIT Python programs that are, or are not, nicely handled by the JIT: loops, even across many calls, are nicely handled loops with very many taken paths are not e.g. Python programs that look like interpreters typical in tracing JITs bad support so far for generators and recursion antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 23 / 35
  • 35. The optimizations we get != optimizations we wrote :-) removed frame handling local variables are in CPU registers or on the C stack but sys._getframe() works correctly “virtuals”: temporary objects are not constructed e = a + b + c + d and much more complex examples attribute and method lookups, etc. antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 24 / 35
  • 36. Example def g(a, b): ADD EAX, 1 if a < 5: # 2 CMP EAX, EBX return -1 JNL <guard 1> return a - b # 3 CMP EAX, 0 JL <guard 2> def f(x): MOV ECX, EAX total = 0 SUB ECX, EBX # 1 JO <guard 3> for i in range(x): ADD EDX, ECX d = g(i, x) JO <guard 4> total += d # 4 JMP antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 25 / 35
  • 37. Example def g(a, b): ADD EAX, 1 if a < 5: # 2 CMP EAX, EBX return -1 JNL <guard 1> return a - b # 3 CMP EAX, 0 JL <guard 2> def f(x): MOV ECX, EAX total = 0 SUB ECX, EBX # 1 JO <guard 3> for i in range(x): ADD EDX, ECX d = g(i, x) JO <guard 4> total += d # 4 JMP antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 25 / 35
  • 38. Practical results fast :-) so far, x86-32 only relatively easy to maintain (or port to x86-64, etc.) reminder: works transparently for any Python code or any language (Prolog JIT :-) at PPDP 2010) viable alternative to CPython antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 26 / 35
  • 39. Part 3 How to use PyPy right now antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 27 / 35
  • 40. Mandelbrot demo Works purely on PyPy Not always the case missing extension modules (cpyext mitigates the problem) libraries that rely on CPython details ... clear performance-critical part antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 28 / 35
  • 41. CPython and PyPy side by side CPython: runs the main application PyPy: subprocess, runs only the hotspots How do they communicate? execnet The Ring of Python, Holger Krekel, 9:00 oups, too late :-) antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 29 / 35
  • 42. Rendering (1) Mandelbrot def render(request): w = int(request.GET.get(’w’, 320)) h = int(request.GET.get(’h’, 240)) from py_mandel import mandelbrot img = mandelbrot(w, h) return HttpResponse(img, content_type="image/bmp") antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 30 / 35
  • 43. Rendering (2) Mandelbrot on PyPy def pypy_render(request): w = int(request.GET.get(’w’, 320)) h = int(request.GET.get(’h’, 240)) channel = pypy.remote_exec(""" from py_mandel import mandelbrot w, h = channel.receive() img = mandelbrot(w, h) channel.send(img) """) channel.send((w, h)) img = channel.receive() return HttpResponse(img, content_type="image/bmp") antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 31 / 35
  • 44. execnet setup At startup import execnet mygroup = execnet.Group() pypy = mygroup.makegateway("popen//python=pypy-c") pypy.remote_exec(""" import sys import os os.chdir("mandelbrot") sys.path.insert(0, ’’) """) antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 32 / 35
  • 45. Demo antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 33 / 35
  • 46. Benchmarks 1400 1200 1000 response time (ms) 800 pypy pypy+pypy 600 cpython cpython+pypy 400 200 0 0 2 4 6 8 10 12 requests/s antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 34 / 35
  • 47. Contact / Q&A Antonio Cuni: at http://merlinux.eu Armin Rigo: arigo (at) tunes.org Links: PyPy: http://pypy.org/ PyPy speed center: http://speed.pypy.org/ Blog: http://morepypy.blogspot.com antocuni, arigato (Pycon Italia Qu4ttro) PyPy 1.2 May 8 2010 35 / 35