Message143727
Here's a completely restructured memoryview implementation that I believe
is quite robust. Both memoryobject.c (the parts I worked on, which is 91%)
and _testbuffer.c have 100% code coverage, including all error conditions [1].
memoryview is tested against the struct module (via _testbuffer's ndarray),
array.array and bytearray. To deal with the case explosions inherent to the
specification test_buffer.py resorts to brute force in some cases (most
notably in testing getbuffer() flags).
PyMemoryViewObject is now a PyVarObject with private arrays. Unless ndim = 0,
shape and strides are always present after initialization.
Memoryview now has support for all native single-value struct module
specifiers. I abandoned the idea of using the struct module for
packing/unpacking. New benchmarks (See #10227) indicate that _testbuffer's
tolist() is over 1000x slower that the optimized versions of memoryview.
The cast function from #5231 is completely implemented.
Review would be much appreciated. Perhaps it would be possible to
do a mini PEP-3118 sprint? Usually I'm never on IRC, but I could
dust off irssi for the occasion.
These are the main changes in detail:
-------------------------------------
o Restructure memoryobject.c into sections.
o Use struct hack in PyMemoryViewObject for the dynamic arrays.
o Rework initialization.
o Add a couple of invariants: A new memoryview will always have complete
shape/strides/format information, unless ndim = 0.
o Add buffer flags: A new memoryview will always have flag information
that determines whether it is a scalar (ndim = 0), C/Fortran contiguous,
NumPY or PIL style, released or active. This eliminates the need for
expensive re-computations during a getbuffer() request.
o Add support for all native struct module formats in indexing, assigning
and tolist().
o Add memoryview.cast(format=x, shape=y), where x is a native format specifier
and y is any multidimensional shape.
o Add PEP-3118 compliant getbuffer() method.
o Slice assignments now support non-contiguous 1-D slices.
o Comparisons now support non-contiguous 1-D buffers.
o Representation of empty shape etc. is now an empty tuple (O.K.
with Mark Dickinson and Travis Oliphant).
[1] 100% coverage requires a patch for systematically triggering failures
of Python API functions. |
|
Date |
User |
Action |
Args |
2011-09-08 14:53:25 | skrah | set | recipients:
+ skrah, teoliphant, mark.dickinson, ncoghlan, rupole, pitrou, vstinner, pv, jcon, petri.lehtinen |
2011-09-08 14:53:25 | skrah | set | messageid: <1315493605.01.0.463857732636.issue10181@psf.upfronthosting.co.za> |
2011-09-08 14:53:24 | skrah | link | issue10181 messages |
2011-09-08 14:53:24 | skrah | create | |
|