[SciPy-Dev] Multilinear interpolation

Pablo Winant pablo.winant@gmail....
Fri Mar 1 04:58:27 CST 2013

So I have updated the tempita template using fused types. I also 
included code generation helper functions in python blocks.

I found a problem with the template generation engine 
Basically, functions defined in python blocks cannot depend upon each 
other. In particular, they cannot be recursive. I avoided the problem by 
defining a dummy function but this is of course not very elegant.

On the pyx side:
- I included a "with nogil, parallel():" instruction but I am not sure 
if it has enabled any parallel calculation at all. Cpu usage seems to 
rely on one core only.
- By looking at the generated C file, I suspect there is still a small 
cython overhead. I see conditional branches inside the loop while there 
should be none.
- Maybe I should not be using memoryviews and use arrays of pointers 
instead inside the loop ? Then would it be enough to pass memoryviews as 
arguments in order to ensure data continuity ?
- Performances are not so bad if I compare to matlab. I tried to 
evaluate a function defined over a [4,3,5,6] 4d-grid on 10000000 random 
points and I got 0.2s vs 1.4s for matlab's interpn(...,'linear*'). Of 
course this is to be taken with a grain of salt and I think it could 
still be improved a bit.

On 25/02/2013 21:19, Pauli Virtanen wrote:
> 25.02.2013 22:04, Pablo Winant kirjoitti:
> [clip]
>>> - The code assumes C-contiguous arrays, but does not check for it.
>> right
> Note that you can make Cython to check for this, the syntax is
> sometype[::1] or sometype[:,::1] for multidim (see below).
> [clip]
>>> You can use fused types instead of templating; the end result is the same,
>>> but Cython takes care of picking the correct routine.
>> I tried it but I didn't see how to do it. I would like to do define a
>> function like
>> def function(ndarray[fused_type, ndim=2]):
>>       ...
>>       cdef fused_type internal_variable
>>       ...
>>       return something
> The syntax for these arrays is
> 	cdef fused number_t:
> 	    double
> 	    double complex
> 	def my_function(fused_type[:,:] arg)
> 	    ...
> I think it doesn't work with the (old) np.ndarray syntax.

More information about the SciPy-Dev mailing list