jah wrote:
> On Tue, May 18, 2010 at 11:33 PM, Dag Sverre Seljebotn
> <[email protected] <mailto:[email protected]>> wrote:
>
> You basically have to stoop down to using C pointers:
>
>
> cpdef evaluate(FTYPE_t *x, FTYPE_t *p, FTYPE_t* out, Py_ssize_t len):
> # Access x[i], p[i]
>
>
> Then call like this:
>
> func.evaluate(<FTYPE_t*>x.data, <FTYPE_t*>p.data, ...)
>
> Note that this relies on mode='c' bit for correctness!
>
>
>
> Looks great! Is it correct that you meant "cdef" rather than
> "cpdef"? My cython complains about not being able to convert "FTYPE_t
> *" to a "Python object" otherwise. So I had to do:
Ah right. Doing this fully featured can be a little tricky, you
basically need to reimplement the "cpdef" functionality:
cdef fast_evaluate(self, double* x, ...):
if is_overridden_in_python(self):
# Create NumPy arrays from ptrs, see e.g. PyArray_CreateXXX (or
was it NewXXX) functions). Then:
return self.evaluate(xarr)
# default computation
cpdef evaluate(self, np.ndarray[...] x):
fast_evaluate(<double*>x.data, ...)
Then, is_overridden_in_python contains this in C:
return Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0;
This is taken from the implementation of cpdef in Cython; it basically
checks whether the object has a dict (= overriden in Python space). I
can't translate that to Cython off the top of my head, but you may be
able to just include it as a macro in a C file if you can't figure out how:
// In foo.h:
#define is_overridden_in_python(x) (Py_TYPE(((PyObject
*)x))->tp_dictoffset != 0)
cdef extern from "foo.h:
cdef bint is_overridden_in_python(object)
Perhaps there's a Python C API function to do this as well.
Dag Sverre
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev