[Cython] Too many instantiations with fused type memoryviews

Stefan Behnel stefan_ml at behnel.de
Sat Mar 8 21:40:40 CET 2014


Pauli Virtanen, 08.03.2014 21:11:
> FYI: Cython instantiates fused type routines with memoryview arguments
> unnecessarily many times.
> 
> Example:
> ```
> ctypedef fused idx_t:
>     short
>     long
> 
> # Cython 0.20.1 instantiates this function 128 times,
> # even though only 2 would be needed
> def fubar_128(idx_t[:] a,
>               idx_t[:] b,
>               idx_t[:] c,
>               idx_t[:] d,
>               idx_t[:] e,
>               idx_t[:] f,
>               idx_t[:] g):
>     print("HALLO")
> 
> def fubar_2(idx_t a,
>             idx_t b,
>             idx_t c,
>             idx_t d,
>             idx_t e,
>             idx_t f,
>             idx_t g):
>     print("HULLO")
> ```
> $ cython cymod.pyx
> $ cython --version
> Cython version 0.20.1
> $ grep -c 'print("HALLO")' cymod.c
> 128
> $ grep -c 'print("HULLO")' _cymod.c
> 2
> 
> The n**m explosion starts to hurt quite quickly when there are several
> array arguments and more than one fused type. I think this issue is
> also accompanied by some signature resolution bugs (I'll try to come
> up with an example case).

Yes, this is a known problem. The work-around is to ctypedef the memory
view type, not just the dtype.

http://thread.gmane.org/gmane.comp.python.cython.user/10437

Stefan



More information about the cython-devel mailing list