Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The State of PyPy (April 2015)

The State of PyPy (April 2015)

Modern programming languages are expected to offer high-level abstractions at reasonable speed. Especially scripting languages like Ruby, PHP and Python are highly dynamic and flexible, which makes performance optimizations difficult to implement.

While Python 3 offers a lot more features compared to Python 2, these features don't always improve runtime performance. In the pystone benchmark, execution speed has even decreased over the recent years.
PyPy, a relatively new implementation of Python with a focus on performance tries to improve the situation - with obvious success. Code execution is much faster thanks to the built-in just in time compiler which optimizes code at runtime.

In this talk I give an overview of PyPy and how it works internally. Also I talk a bit about PyPy STM, a new approach for parallel code execution that can take advantage of modern multi-core hardware.

Matthias Endler

April 29, 2015
Tweet

More Decks by Matthias Endler

Other Decks in Programming

Transcript

  1. Why PyPy? "Scientific American" Vol. XXXVI, No. 19, May 12,

    1877 p.294 New York: Munn &Company (Publisher)
  2. Why PyPy? No more support for older versions Major bugfixes

    New language features Improved performance Incentives to switch to a new language version
  3. Why PyPy? Two ways to speed up a scripting language

    •Improve the implementation •Improve the runtime
  4. Why PyPy? Two ways to speed up a scripting language

    •Improve the implementation •Improve the runtime
  5. 0 35 70 105 140 1.8.7 1.9.3 2.0.0 2.1.0 2.2.0

    Relative Ruby performance Why PyPy? Source: isrubyfastyet.com speed (%) version baseline (100%) +12% +30% +35% +36%
  6. Why PyPy? 0 65 130 195 260 5.2 5.3 5.4

    5.5 5.6 7.0 Relative PHP performance Source: PHPNG a new core for PHP7 by Dmitry Stogov baseline (100%) speed (%) version +13% +36% +39% +50% +149%
  7. Why PyPy? 25 50 75 100 2.6 2.7 3.4 Relative

    Python performance Source: pystone benchmark on Core i7, 16 GB RAM baseline (100%) speed (%) version -10% -3%
  8. Why PyPy? 0 38 75 113 150 2007 2009 2011

    2013 2015 PHP Python Ruby baseline (100%) speed (%) time Relative performance improvements per language over time
  9. Why PyPy? The net result of the 3.0 generalizations is

    that 
 Python 3.0 runs the pystone benchmark around 10% slower than Python 2.5. Most likely the biggest cause is the removal of special-casing for small integers. There’s room for improvement, but it will happen after 3.0 is released! docs.python.org/3/whatsnew/3.0.html
  10. Why PyPy? Two ways to speed up a scripting language

    •Improve the implementation •Improve the runtime
  11. What is PyPy? Followup of Psyco runtime Version 1.0 in

    2007 Python written in Python Just-In-Time compiler Compatible with Python 2.7 and 3.4
  12. What is PyPy? Followup of Psyco runtime Version 1.0 in

    2007 Python written in Python RPython Just-In-Time compiler Compatible with Python 2.7 and 3.4
  13. PyPy implementation • Variables in any given control flow path

    must have only a single type • No multiple inheritance • No generators • Most dunder-methods can't be used. RPython is a subset of Python http:/ /www.quora.com/PyPy/How-annoying-is-writing-RPython-compared-to-Python
  14. Project milestones 2008 Django support 2010 First JIT-compiler 2011 Compatibility

    with CPython 2.7 2014 Basic ARM support CPython 3 support Improve compatibility with C extensions NumPyPy Multi-threading support
  15. Project milestones 2008 Django support 2010 First JIT-compiler 2011 Compatibility

    with CPython 2.7 2014 Basic ARM support CPython 3 support Improve compatibility with C extensions NumPyPy Multi-threading support
  16. PyPy STM 10 loops, best of 3: 1.2 sec per

    loop 10 loops, best of 3: 822 msec per loop from threading import Thread def count(n): while n > 0: n -= 1 def run(): t1 = Thread(target=count, args=(10000000,)) t1.start() t2 = Thread(target=count, args=(10000000,)) t2.start() t1.join(); t2.join() def count(n): while n > 0: n -= 1 def run(): count(10000000) count(10000000) Inside the Python GIL - David Beazley
  17. PyPy STM T1 T2 T3 x y z Thread 1

    Shared memory T1 T2 T3 Thread 2
  18. PyPy STM T1 T2 T3 x = 3 x y

    z Thread 1 Shared memory T1 T2 T3 y=5 Thread 2
  19. PyPy STM T1 T2 T3 3 5 x y z

    Thread 1 Shared memory T1 T2 T3 Thread 2
  20. PyPy STM T1 T2 T3 x = 18
 y= 12

    3 5 x y z Thread 1 Shared memory T1 T2 T3 x = 2 Thread 2
  21. PyPy STM T1 T2 T3 2 5 x y z

    Thread 1 Shared memory T1 T2 T3 Thread 2
  22. Blueprints provided by Marcel Douwe Dekker under Creative Commons. https://www.flickr.com/photos/marceldouwedekker/7564782310/in/

    photostream/ 
 Blueprint by Joy Oil Co Ltd (http://commons.wikimedia.org/wiki/ File:Joy_Oil_gas_station_blueprints.jpg) Credits
  23. by Simon Child and by Luis Prado by Océan Bussard

    by Luis Rodrigues by Mister Pixel by Alexander Wiefel by Darin S by spotted paint 
 The icons used in this presentation were downloaded from The Noun Project.
 Thanks to the following artists: