[Cython] CEP1000: Native dispatch through callables
Dag Sverre Seljebotn
d.s.seljebotn at astro.uio.no
Sun Apr 15 08:33:24 CEST 2012
On 04/15/2012 08:16 AM, Stefan Behnel wrote:
> Robert Bradshaw, 15.04.2012 07:59:
>> On Sat, Apr 14, 2012 at 2:00 PM, mark florisson wrote:
>>> There may be a lot of promotion/demotion (you likely only want the
>>> former) combinations, especially for multiple arguments, so perhaps it
>>> makes sense to limit ourselves a bit. For instance for numeric scalar
>>> argument types we could limit to long (and the unsigned counterparts),
>>> double and double complex.
>>>
>>> So char, short and int scalars will be
>>> promoted to long, float to double and float complex to double complex.
>>> Anything bigger, like long long etc will be matched specifically.
>>> Promotions and associated demotions if necessary in the callee should
>>> be fairly cheap compared to checking all combinations or going through
>>> the python layer.
>>
>> True, though this could be a convention rather than a requirement of
>> the spec. Long vs.< long seems natural, but are there any systems
>> where (scalar) float still has an advantage over double?
>>
>> Of course pointers like float* vs double* can't be promoted, so we
>> would still need this kind of type declaration.
>
> Yes, passing data sets as C arrays requires proper knowledge about their
> memory layout on both sides.
>
> OTOH, we are talking about functions that would otherwise be called through
> Python, so this could only apply for buffers anyway. So why not require a
> Py_buffer* as argument for them?
Is the proposal to limit the range of types valid for arguments?
I'm a bit wary of throwing this into the mix. We know very little about
the callee, they could decide:
a) To only export a C function and have an exeption-raising __call__
b) To accept ctypes pointers in their __call__, and C pointers in
their native-call
c) They can invent their own use for this!
I think agreeing on a CEP gets a lot simpler, and the result cleaner, if
we focus on "how to describe C functions for the purposes of calling
them" (for various usecases), and leave "conventions for recommended
signatures" for CEP 1001.
In Cython, we could always export a fully-promoted-scalar function first
in the list, and always try to call this first, which would work well
with Cython<->Cython.
BTW, when Travis originally wanted a proposal on the NumPy list he just
wanted it for "a C function"; his idea was something like
mycapsule = numbaize(f)
scipy.integrate(mycapsule)
just saying that the fast-callable aspect isn't everything, passing the
function pointer around was how this started.
Dag
More information about the cython-devel
mailing list