43
PyPy The state of 2015-04 @matthiasendler

The state of PyPy

  • Upload
    mre

  • View
    49

  • Download
    0

Embed Size (px)

Citation preview

PyPyThe state of

2015-04 @matthiasendler

Why PyPy?

"Scientific American" Vol. XXXVI, No. 19, May 12, 1877 p.294 New York: Munn &Company (Publisher)

Why PyPy?

What keeps you from using switching to Python 3?

Why PyPy?

No more support for older versions

Major bugfixes

New language features

Improved performance

Incentives to switch to a new language version

Why PyPy?

More speed means…

less servers

new possibilities

Why PyPy?

Two ways to speed up a scripting language

• Improve the implementation

• Improve the runtime

Why PyPy?

Two ways to speed up a scripting language

• Improve the implementation

• Improve the runtime

Why PyPy?

Warning:Benchmarks are always error-prone.Always measure yourself!This is just a trend.

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%

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%

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%

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

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

Why PyPy?

Two ways to speed up a scripting language

• Improve the implementation

• Improve the runtime

Why PyPy?

Ruby Rubinius

PyPy

HHVM

Python

PHP

About PyPy

Cottrell & Babcock's air spring printing pressSource: Scientific American, June 22, 1872

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

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

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

PyPy implementation

Tracing JIT compiler

http://www.aosabook.org/en/pypy.html

Your Python program

PyPy implementation

Tracing JIT compiler

http://www.aosabook.org/en/pypy.html

„Hot“ loop

PyPy implementation

Tracing JIT compiler

http://www.aosabook.org/en/pypy.html

can_enter_jit()

jit_merge_point()

PyPy implementation

Tracing JIT compiler

http://www.aosabook.org/en/pypy.html

Optimized machine code

PyPy Speed

speed.pypy.org

Upright boring machine, 1872Source: Scientific American, Nov 23,1872

Demo

The future of PyPy

Berryman's steam trap, 1872Source: Scientific American, Sept 14,1872

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

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

PyPy STM

PyPy STM

http://dabeaz.com/GIL/gilvis/

GIL locking

PyPy STM

10 loops, best of 3: 1.2 sec per loop10 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

PyPy STM

T1

T2

T3

xyz

Thread 1

Shared memoryT1

T2

T3

Thread 2

PyPy STM

T1

T2

T3

x = 3

xyz

Thread 1

Shared memoryT1

T2

T3

y=5

Thread 2

PyPy STM

T1

T2

T3

3

5

xyz

Thread 1

Shared memoryT1

T2

T3

Thread 2

PyPy STM

T1

T2

T3

x = 18y= 12

3

5

xyz

Thread 1

Shared memoryT1

T2

T3

x = 2

Thread 2

PyPy STM

T1

T2

T3

2

5

xyz

Thread 1

Shared memoryT1

T2

T3

Thread 2

Lathrop's sewing machine, 1872Source: Scientific American, Oct 26,1872

Demo

Conclusion

…already awesome for sequential tasks

…gradually improving parallel performance

…a very important Python project

PyPy is…

Further readingPython 3 Performance

https://speakerdeck.com/pyconslides/python-3-dot-3-trust-me-its-better-than-python-2-dot-7-by-dr-brett-cannon

https://www.youtube.com/watch?v=UJPdhx5zTaw

Further readingRPython

http://tratt.net/laurie/blog/entries/fast_enough_vms_in_fast_enough_time

Further readingPyPy STM

http://pypy.readthedocs.org/en/latest/stm.html

http://morepypy.blogspot.de/

Demo code from http://www.ripton.net/blog/?p=104

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

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: