quick introduction to cython - scipy india · quick introduction to cython prabhu ramachandran...

27
Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1 / 26

Upload: hoangthien

Post on 30-Apr-2018

233 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Quick introduction to Cython

Prabhu Ramachandran

Enthought Inc.Mumbai

SciPy India,Mumbai

Dec. 28, 2012

FOSSEE (IIT Bombay) Cython 1 / 26

Page 2: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Outline

1 Cython

FOSSEE (IIT Bombay) Cython 2 / 26

Page 3: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Motivation

Pure Python can be very slowNot trivial to write C-extensionsInterfacing to C libraries not too easy

FOSSEE (IIT Bombay) Cython 3 / 26

Page 4: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Introduction

Python-based languageOptional static typingCall external C librariesPython to C compiler“Cython is Python with C-data-types”cython.org

docs.cython.org

500x speedup is possible!

FOSSEE (IIT Bombay) Cython 4 / 26

Page 5: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Basic structure

file.sofile.cfile.pyx

import file

cython compiler

file.pyx import filepyximport

distutils (setup.py)

FOSSEE (IIT Bombay) Cython 5 / 26

Page 6: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Simple example

# -- hello.pyx --def hello(name):

print("Hello %s!"%name)# EOF

$ ipythonIn []: import pyximportIn []: pyximport.install()In []: import helloIn []: hello.hello(’PyCon’)Hello PyCon!

FOSSEE (IIT Bombay) Cython 6 / 26

Page 7: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Simple setup.py

# -- setup.py --from setuptools import setupfrom Cython.Distutils import build_extfrom numpy.distutils.extension import \

Extensionsetup(

cmdclass = {’build_ext’: build_ext},ext_modules = [Extension("hello",

["hello.pyx"])]

)# EOF

FOSSEE (IIT Bombay) Cython 7 / 26

Page 8: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Compiling the code

$ python setup.py build_ext --inplace# ...$ ipythonIn []: import helloIn []: hello.hello(’PyCon’)Hello PyCon!

FOSSEE (IIT Bombay) Cython 8 / 26

Page 9: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Meaningful example: Phase 0

# -- quad0.pyx --from math import sindef f(x):

return sin(x**2)

def integrate(a, b, N):s = 0dx = float(b-a)/Nfor i in range(N):

s += f(a+i*dx)return s * dx

FOSSEE (IIT Bombay) Cython 9 / 26

Page 10: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Phase 1# -- quad1.pyx --from math import sin

def f(double x):return sin(x**2)

def integrate(double a, double b, int N):cdef int icdef double s, dxs = 0.0dx = float(b-a)/Nfor i in range(N):

s += f(a+i*dx)return s * dx

FOSSEE (IIT Bombay) Cython 10 / 26

Page 11: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Timing

In []: import quad0In []: %timeit quad0.integrate(0,1,10000)100 loops, best of 3: 3.45 ms per loop

In []: import quad1In []: %timeit quad1.integrate(0,1,10000)100 loops, best of 3: 2.24 ms per loop

Not much.

FOSSEE (IIT Bombay) Cython 11 / 26

Page 12: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Cython annotation

$ cython -a quad1.pyx

$ firefox quad1.html

Very handy!15 m

FOSSEE (IIT Bombay) Cython 12 / 26

Page 13: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Phase 2

# -- quad2.pyx --from math import sincdef double f(double x) except *:

return sin(x**2)# ...

Could also use cpdef instead

In []: %timeit quad2.integrate(0,1,10000)1000 loops, best of 3: 1.25 ms per loop

Looks like calling a Python function is slow.

FOSSEE (IIT Bombay) Cython 13 / 26

Page 14: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Phase 3: external C functions

Calling math.h

# -- quad3.pyx --cdef extern from "math.h":

double sin(double)

cdef double f(double x):return sin(x**2)

# ...

In []: %timeit quad3.integrate(0,1,10000)1000 loops, best of 3: 276 us per loop

FOSSEE (IIT Bombay) Cython 14 / 26

Page 15: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Extension classes

cdef class Function:cpdef double eval(self, double x) except *:

return 0

cdef class SinOfSquareFunction(Function):cpdef double eval(self, double x) except *:

return sin(x*x)

def integrate(Function f, double a, double b,int N):

# ...for i in range(N):

s += f.eval(a+i*dx)return s * dx

FOSSEE (IIT Bombay) Cython 15 / 26

Page 16: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Extension classes

cdef class Function:cpdef double eval(self, double x) except *:

return 0

cdef class SinOfSquareFunction(Function):cpdef double eval(self, double x) except *:

return sin(x*x)

def integrate(Function f, double a, double b,int N):

# ...for i in range(N):

s += f.eval(a+i*dx)return s * dx

FOSSEE (IIT Bombay) Cython 15 / 26

Page 17: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Extension classes

Can be extended in PythonNo multiple inheritanceCannot subclass Python class in CythonCan have typed attributesMore info: docs.cython.org

25 m

FOSSEE (IIT Bombay) Cython 16 / 26

Page 18: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

NumPy support

import numpy as npcimport numpy as np

# Declare numpy arrays.cdef np.ndarray arr

# Better stillcdef np.ndarray[np.int64_t, ndim=2] arr

FOSSEE (IIT Bombay) Cython 17 / 26

Page 19: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Plot the Mandelbrot set

Consider points in the complex plane. For eachpoint, c, calculate zn+1 = z2

n + c, with z0 = 0.Note that if zi > 2 the solution will diverge.We would like to plot the number of iterations apoint diverges in.We are given w, h as width and height of image.Region of interest is [-2, -1.4] to [0.8, 1.4].

FOSSEE (IIT Bombay) Cython 18 / 26

Page 20: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Naive solutiondef mandel_py(h, w, maxit=20):

"""Returns the Mandelbrot set."""x, y = np.ogrid[-2:0.8:w*1j, -1.4:1.4:h*1j]c = x+y*1joutput = np.zeros((w, h), dtype=int) + maxitfor i in range(h):

for j in range(w):z = c[i,j]c0 = c[i,j]for k in xrange(maxit):

z = z**2 + c0if z*z.conjugate() > 4.0:

output[i, j] = kbreak

return output.T

FOSSEE (IIT Bombay) Cython 19 / 26

Page 21: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

NumPy solution

def mandel_np(h, w, maxit=20):"""Returns the Mandelbrot set."""x, y = np.ogrid[-2:0.8:w*1j, -1.4:1.4:h*1j]c = x+y*1jz = coutput = np.zeros((w, h), dtype=int) + maxitfor i in xrange(maxit):

z = z**2 + cdiverged = z*z.conj() > 4c[diverged] = 0z[diverged] = 0output[diverged] = i

return output.T

FOSSEE (IIT Bombay) Cython 20 / 26

Page 22: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

The resultIn []: from mandel import mandel_npIn []: o = mandel_np(1024,1024)In []: imshow(o)

Page 23: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Cython example I

import numpy as np

cimport cythoncimport numpy as [email protected](False)def mandel_cy(int h, int w, int maxit=20):

"""Mandelbrot set ..."""cdef np.ndarray[np.complex128_t, ndim=2] ccdef np.ndarray[np.int64_t, ndim=2] outputcdef int i, j, kcdef double complex c0, z

FOSSEE (IIT Bombay) Cython 22 / 26

Page 24: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Cython example II

x, y = np.ogrid[-2:0.8:w*1j, -1.4:1.4:h*1j]c = x+y*1joutput = np.zeros((w, h), dtype=int) + maxitfor i in range(h):

for j in range(w):z = c[i,j]c0 = c[i,j]for k in xrange(maxit):

z = z**2 + c0if (z*z.conjugate()).real > 4.0:

output[i, j] = kbreak

return output.T

FOSSEE (IIT Bombay) Cython 23 / 26

Page 25: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

The resultIn []: from mandel_cy import mandel_cyIn []: o = mandel_cy(1024,1024)In []: imshow(o)

Page 26: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Timing

In []: %timeit mandel_py(256, 256)1 loops, best of 3: 2.96 s per loop

In []: %timeit mandel_np(256,256)10 loops, best of 3: 42.5 ms per loop

In []: %timeit mandel_cy(256,256)100 loops, best of 3: 3.95 ms per loop

A whopping 700x speedup!

FOSSEE (IIT Bombay) Cython 25 / 26

Page 27: Quick introduction to Cython - SciPy India · Quick introduction to Cython Prabhu Ramachandran Enthought Inc. Mumbai SciPy India, Mumbai Dec. 28, 2012 FOSSEE (IIT Bombay) Cython 1

Cython

Additional points

.pxd filesCompiler directives:

nonecheckboundscheck

35 m

FOSSEE (IIT Bombay) Cython 26 / 26