[Cython] buffer syntax vs. memory view syntax
Dag Sverre Seljebotn
d.s.seljebotn at astro.uio.no
Thu May 10 09:37:51 CEST 2012
On 05/09/2012 09:08 PM, mark florisson wrote:
> On 9 May 2012 19:56, Robert Bradshaw<robertwb at gmail.com> wrote:
>> On Tue, May 8, 2012 at 3:35 AM, mark florisson
>> <markflorisson88 at gmail.com> wrote:
>>> On 8 May 2012 10:47, Dag Sverre Seljebotn<d.s.seljebotn at astro.uio.no> wrote:
>>>>
>>>> After some thinking I believe I can see more clearly where Mark is coming
>>>> from. To sum up, it's either
>>>>
>>>> A) Keep both np.ndarray[double] and double[:] around, with clearly defined
>>>> and separate roles. np.ndarray[double] implementation is revamped to allow
>>>> fast slicing etc., based on the double[:] implementation.
>>>>
>>>> B) Deprecate np.ndarray[double] sooner rather than later, but make double[:]
>>>> have functionality that is *really* close to what np.ndarray[double]
>>>> currently does. In most cases one should be able to basically replace
>>>> np.ndarray[double] with double[:] and the code should continue to work just
>>>> like before; difference is that if you pass in anything else than a NumPy
>>>> array, it will likely fail with a runtime AttributeError at some point
>>>> rather than fail a PyType_Check.
>>>
>>> That's a good summary. I have a big preference for B here, but I agree
>>> that treating a typed memoryview as both a user object (possibly
>>> converted through callback) and a typed memoryview "subclass" is quite
>>> magicky.
>>
>> With the talk of overlay modules and go-style interface, being able to
>> specify the type of an object as well as its bufferness could become
>> more interesting than it even is now. The notion of supporting
>> multiple interfaces, e.g.
>>
>> cdef np.ndarray& double[:] my_array
>>
>> could obviate the need for np.ndarray[double]. Until we support
>> something like this, or decide to reject it, I think we need to keep
>> the old-style syntax around. (np.ndarray[double] could even become
>> this intersection type to gain all the new features before we decide
>> on a appropriate syntax).
>
> It's kind of interesting but also kind of a pain to declare everywhere
> like that. Buffer syntax should by no means deprecated in the near
> future, but at some point it will be better to have one way to do
> things, whether slightly magicky or more convoluted or not. Also, as
> Dag mentioned, if we want fused extension types it makes more sense to
> remove buffer syntax to disambiguate this and avoid context-dependent
> special casing (e.g. np.ndarray and array.array).
I don't think it hurts to have two ways of doing things if they are
sufficiently well-motivated, sufficiently well-defined, and sufficiently
different from one another.
The original reason I wanted double[:] was to stop tying ourselves to
NumPy and don't promise to be compatible, because of the polymorphic
aspect of NumPy. I think in the future, the Python behaviour of, say, +,
in np.ndarray is going to be different from what we have today. You'll
have the + fetching data over the network in some cases, or treating NA
in special ways (I think there might be over a thousand about NA on the
NumPy now?). In short, lots of stuff can be going on that we can't
emulate in Cython.
OTOH, perhaps that doesn't matter -- we just raise an exception for the
NumPy arrays that we can't deal with, and move on...
>>> I wouldn't particularly mind something concise like 'm.obj'.
>>> The AttributeError would be the case as usual, when a python object
>>> doesn't have the right interface.
>>
>> Having to insert the .obj in there does make it more painful to
>> convert existing Python code.
>
> Yes, hence my slight bias towards magicky. But I do fully agree with
> all opposing arguments that say "too much magic". I just prefer to be
> pragmatic here :)
It's a very big decision. I think two or three alternatives are starting
to crystallise; but to choose between them I think it calls for a CEP
with code examples, and a request for comment on both cython-users and
numpy-discussion.
Until that happens, avoiding any magic seems like a conservative
forward-compatible default.
Dag
More information about the cython-devel
mailing list