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

Cython

 Cython

Cython presentation given in one of the Skyscanner lightning talks on 2013-03-07

Avatar for Saulius Lukauskas

Saulius Lukauskas

March 07, 2013
Tweet

More Decks by Saulius Lukauskas

Other Decks in Programming

Transcript

  1. In [2]: %timeit min_coin_change(28, [1,2,5]) 10000 loops, best of 3:

    163 µs per loop In [3]: %timeit min_coin_change(28, [1,2,4,5]) 1000 loops, best of 3: 262 µs per loop In [4]: %timeit min_coin_change(10000, [1,2,4,5]) 10 loops, best of 3: 73.9 ms per loop In [5]: %timeit min_coin_change(100000, [1,2,4,5]) 1 loops, best of 3: 803 ms per loop Runtime:
  2. Removing the “P” from CPython https://secure.flickr.com/photos/togawanderings/8369738603/ Most importantly, Cython allows

    you to: Add static type declarations to Python Call C from back and forth natively
  3. https://secure.flickr.com/photos/dmclear/5398254250/ from distutils.core import setup from distutils.extension import Extension from

    Cython.Distutils import build_ext setup( cmdclass = {'build_ext': build_ext}, ext_modules = [Extension("change", ["change.pyx"])] )
  4. https://secure.flickr.com/photos/dmclear/5398254250/ In [2]: %timeit min_coin_change(28, [1,2,5]) 10000 loops, best of

    3: 146 µs per loop In [3]: %timeit min_coin_change(28, [1,2,4,5]) 10000 loops, best of 3: 181 µs per loop In [4]: %timeit min_coin_change(10000, [1,2,4,5]) 10 loops, best of 3: 61.6 ms per loop In [5]: %timeit min_coin_change(100000, [1,2,4,5]) 1 loops, best of 3: 613 ms per loop
  5. https://secure.flickr.com/photos/dmclear/5398254250/ In [2]: %timeit min_coin_change(28, [1,2,5]) 10000 loops, best of

    3: 146 µs per loop In [3]: %timeit min_coin_change(28, [1,2,4,5]) 10000 loops, best of 3: 181 µs per loop In [4]: %timeit min_coin_change(10000, [1,2,4,5]) 10 loops, best of 3: 61.6 ms per loop In [5]: %timeit min_coin_change(100000, [1,2,4,5]) 1 loops, best of 3: 613 ms per loop In [2]: %timeit min_coin_change(28, [1,2,5]) 10000 loops, best of 3: 163 µs per loop In [3]: %timeit min_coin_change(28, [1,2,4,5]) 1000 loops, best of 3: 262 µs per loop In [4]: %timeit min_coin_change(10000, [1,2,4,5]) 10 loops, best of 3: 73.9 ms per loop In [5]: %timeit min_coin_change(100000, [1,2,4,5]) 1 loops, best of 3: 803 ms per loop
  6. In [4]: %timeit min_coin_change(28, [1,2,5]) 100000 loops, best of 3:

    8.15 µs per loop In [5]: %timeit min_coin_change(28, [1,2,4,5]) 100000 loops, best of 3: 8.8 µs per loop In [6]: %timeit min_coin_change(10000, [1,2,4,5]) 1000 loops, best of 3: 1.74 ms per loop In [7]: %timeit min_coin_change(100000, [1,2,4,5]) 100 loops, best of 3: 17.6 ms per loop Optimised runtime:
  7. In [4]: %timeit min_coin_change(28, [1,2,5]) 100000 loops, best of 3:

    8.15 µs per loop In [5]: %timeit min_coin_change(28, [1,2,4,5]) 100000 loops, best of 3: 8.8 µs per loop In [6]: %timeit min_coin_change(10000, [1,2,4,5]) 1000 loops, best of 3: 1.74 ms per loop In [7]: %timeit min_coin_change(100000, [1,2,4,5]) 100 loops, best of 3: 17.6 ms per loop In [2]: %timeit min_coin_change(28, [1,2,5]) 10000 loops, best of 3: 163 µs per loop In [3]: %timeit min_coin_change(28, [1,2,4,5]) 1000 loops, best of 3: 262 µs per loop In [4]: %timeit min_coin_change(10000, [1,2,4,5]) 10 loops, best of 3: 73.9 ms per loop In [5]: %timeit min_coin_change(100000, [1,2,4,5]) 1 loops, best of 3: 803 ms per loop
  8. In [7]: %timeit min_coin_change(100000, [1,2,4,5]) 100 loops, best of 3:

    17.6 ms per loop In [5]: %timeit min_coin_change(100000, [1,2,4,5]) 1 loops, best of 3: 803 ms per loop 45.625 times faster
  9. Further optimisations: Compiler flags, e.g. disabling bounds checking for array

    https://secure.flickr.com/photos/southerncomfort/86189992/ Rewriting part of the function in C
  10. Other scenarios: One could use a native c library (e.g.

    lxml) directly from Cython bypassing the python layer https://secure.flickr.com/photos/southerncomfort/86189992/
  11. More info: http://www.cython.org/ https://secure.flickr.com/photos/southerncomfort/86189992/ Saulius Lukauskas, 2013-03-07 "We should forget

    about small efficiencies, say about 97% of the time: premature optimization is the root of all evil" Donald Knuth