[Python-Dev] Extended Buffer Interface/Protocol

Travis Oliphant oliphant.travis at ieee.org
Wed Mar 21 21:36:32 CET 2007

I'm soliciting feedback on my extended buffer protocol that I am 
proposing for inclusion in Python 3000.  As soon as the Python 3.0 
implementation is complete, I plan to back-port the result to Python 
2.6, therefore, I think there may be some interest on this list.

Basically, the extended buffer protocol seeks to allow memory sharing with

1) information about what is "in" the memory (float, int, C-structure, etc.)
2) information about the "shape" of the memory (if any)

3) information about discontiguous memory segments

Number 3 is where I could use feedback --- especially from PIL users and 
developers.   Strides are a common way to think about a possibly 
discontiguous chunk of memory (which appear in NumPy when you select a 
sub-region from a larger array). The strides vector tells you how many 
bytes to skip in each dimension to get to the next memory location for 
that dimension.

Because NumPy uses this memory model as do several compute libraries 
(like BLAS and LAPACK), it makes sense to allow this memory model to be 
shared between objects in Python.

Currently, the proposed buffer interface eliminates the multi-segment 
option (for Python 3.0) which I think was originally put in place 
because of the PIL.   However, I don't know if it is actually used by 
any extension types.  This is a big reason why Guido wants to drop the 
multi-segment interface option.

The question is should we eliminate the possibility of sharing memory 
for objects that store data basically as "arrays" of arrays (i.e. true 
C-style arrays).  That is what I'm currently proposing, but I could also 
see an argument that states that if we are going to support strided 
memory access, we should also support array of array memory access.

If this is added, then it would be another function-call that gets a 
array-of-array-style memory from the object.  What do others think of 
these ideas?

One possible C-API call that Python could grow with the current buffer 
interface is to allow contiguous-memory mirroring of discontiguous 
memory, or an iterator object that iterates through every element of any 
object that exposes the buffer protocol.

Thanks for any feedback,

-Travis Oliphant

More information about the Python-Dev mailing list