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

The State of PyPy (April 2015)

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on. →

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

Transcript

43 slides
  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:

More Decks by Matthias Endler

Other Decks in Programming