Schnelle Schleifen mit Cython

Dr. Stefan Behnel

(Cython Core-Entwickler, Consultant und Schulungsleiter)

http://consulting.behnel.de/

http://cython.org/

Was ist Cython?

Cython ist die Brücke zwischen
der Einfachheit von Python und
der Performance von C/C++/Fortran.
images/SimplicityVsSpeed1.png

Was ist Cython?

Cython ist die Brücke zwischen
der Einfachheit von Python und
der Performance von C/C++/Fortran.
images/SimplicityVsSpeed.png

Was ist Cython?

Cython ist

Wie geht das?

"Wir schreiben C, damit ihr es nicht müsst!"

Schnelle Schleifen mit Cython

Version 0.17.x von Cython unterstützt:

Geplant für Version 0.18:

Das Buffer-Interface

Memory Views

cdef add_one_2d(double[:,:] buf):
    cdef size_t x,y
    for x in xrange(buf.shape[0]):
        for y in xrange(buf.shape[1]):
            buf[x,y] += 1

Memory View Slices

cdef add_one_2d(double[:,:] buf):
    ...

def add_one_to_even_lines(double[:,:] buf):
    add_one_2d(buf[:,::2])
cdef int[1:102:2,:] partial_view = exporting_object

Fused Types

ctypedef fused floating:
    float
    double

cdef add_one_2d(floating[:,:] buf):
    cdef size_t x,y
    for x in xrange(buf.shape[0]):
        for y in xrange(buf.shape[1]):
            buf[x,y] += 1

OpenMP

from cython.parallel cimport prange

def add_one_parallel(double[:,:] buf):
    cdef size_t x,y
    for x in prange(buf.shape[0], nogil=True):
        for y in xrange(buf.shape[1]):
            buf[x,y] += 1

OpenMP scheduling

OpenMP Reduktionen

from cython.parallel cimport prange

def parallel_sum(double[:] buf):
    cdef size_t i
    cdef double result = 0.0
    for i in prange(buf.shape[0], nogil=True):
        result += buf[i]
    return result

Zusammenfassung