Commit 269963f8 authored by nbruin's avatar nbruin

explain difference between cdef and cpdef

parent e8bd1789
...@@ -32,20 +32,25 @@ Cython code and pure Python code. ...@@ -32,20 +32,25 @@ Cython code and pure Python code.
So far our integration example has not been very useful as it only So far our integration example has not been very useful as it only
integrates a single hard-coded function. In order to remedy this, integrates a single hard-coded function. In order to remedy this,
without sacrificing speed, we will use a cdef class to represent a with hardly sacrificing speed, we will use a cdef class to represent a
function on floating point numbers:: function on floating point numbers::
cdef class Function: cdef class Function:
cpdef double evaluate(self, double x) except *: cpdef double evaluate(self, double x) except *:
return 0 return 0
Like before, cpdef makes two versions of the method available; one The directive cpdef makes two versions of the method available; one
fast for use from Cython and one slower for use from Python. Then:: fast for use from Cython and one slower for use from Python. Then::
cdef class SinOfSquareFunction(Function): cdef class SinOfSquareFunction(Function):
cpdef double evaluate(self, double x) except *: cpdef double evaluate(self, double x) except *:
return sin(x**2) return sin(x**2)
This does slightly more than providing a python wrapper for a cdef
method: unlike a cdef method, a cpdef method is fully overrideable by
subclasses and instance attributes. This adds a little calling overhead
compared to a cdef method.
Using this, we can now change our integration example:: Using this, we can now change our integration example::
def integrate(Function f, double a, double b, int N): def integrate(Function f, double a, double b, int N):
...@@ -62,8 +67,8 @@ Using this, we can now change our integration example:: ...@@ -62,8 +67,8 @@ Using this, we can now change our integration example::
print(integrate(SinOfSquareFunction(), 0, 1, 10000)) print(integrate(SinOfSquareFunction(), 0, 1, 10000))
This is almost as fast as the previous code, however it is much more flexible This is almost as fast as the previous code, however it is much more flexible
as the function to integrate can be changed. It is even possible to pass as the function to integrate can be changed. We can even pass in a new
in a new function defined in Python-space:: function defined in Python-space::
>>> import integrate >>> import integrate
>>> class MyPolynomial(integrate.Function): >>> class MyPolynomial(integrate.Function):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment