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.
So far our integration example has not been very useful as it only
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::
cdef class Function:
cpdef double evaluate(self, double x) except *:
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::
cdef class SinOfSquareFunction(Function):
cpdef double evaluate(self, double x) except *:
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::
def integrate(Function f, double a, double b, int N):
......@@ -62,8 +67,8 @@ Using this, we can now change our integration example::
print(integrate(SinOfSquareFunction(), 0, 1, 10000))
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
in a new function defined in Python-space::
as the function to integrate can be changed. We can even pass in a new
function defined in Python-space::
>>> import integrate
>>> 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