[Cython] __next__ | not being able to use cpdef

Daniel (ajax) Diniz ajaksu at gmail.com
Thu Dec 11 06:07:59 CET 2008


Am I the only one thinking Jelle might know which bits of his function
are slow? :)

Jelle Feringa  wrote:
>	n=1
>	for a in ogrid[ 0:1:complex(n_samples)].tolist():
>		for b in ogrid[ 0:1:complex(n_samples)].tolist():
>			curv = curvature( a, b )
>			a_wrapped_datatype( n, curv )
>			n+=1
>	return a_wrapped_datatype

I think your loop might be doing unnecessary work. See if this helps:
	cdef int a, b, arrlen
	myarray = ogrid[ 0:1:complex(n_samples)]
	arrlen = len(myarray)
	for a from 0 <= a < arrlen:
		for b from 0 <= b < arrlen:
			curv = curvature( myarr[a], myarr[b])

The "cdef int" shouldn't give you any benefit right now, rather being
slower. If you can index the  array (or its buffer) with non-Python
ints, it should be faster (look at numpy integration, Dag's work :).
If not, just avoiding the calls to tolist() in the inner loop could be
nice.

Check http://docs.cython.org/docs/numpy_tutorial.html

Now, if you could bypass the python layer in certain places, like
calling the real C++_curvature with a real float instead of a python
float, cdef'ing n to [numpy]int and a_wrapped_datatype to (int,
float?), you'd get things going faster without having to start a new
wrapper from zero.

Regards,
Daniel


More information about the Cython-dev mailing list