Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/cuspaceflight/magicmemoryview

Magic memoryview() style casting for Cython
https://github.com/cuspaceflight/magicmemoryview

Last synced: about 2 months ago
JSON representation

Magic memoryview() style casting for Cython

Awesome Lists containing this project

README

        

A helper / hack to allow us to cast a ``mmap.mmap`` or other buffer to
a Cython pointer of the correct type.

Cython is capable of casting a lot of things to a C pointer of the
correct type, especially with the aid of ``memoryview``. However,
in Python 2, ``memoryview`` lacks the ``memoryview.cast`` method
(so Cython won't let us change the dimensions of the array). Further,
both Python 2 and 3 require the memory map to be writable (making
the pointer type ``const`` does not seem to help here either).

This class takes a (possibly read-only) memmap object, and produces a
Python object with a ``__getbuffer__`` method that returns The Right Thing.
*It pretends that the underlying buffer is writable* to make Cython
happy. If you give it a read-only buffer, and try to write to the result,
then you will have a bad time.

When a Python object is cast by Cython to a pointer, it holds a
reference to the underlying Python object in order to prevent the
memory to which it refers being garbage collected. The ``MagicMemoryView``
in turn keeps a reference to the underlying data, so everything should
behave as expected.

Usage::

from magicmemoryview import MagicMemoryView

cdef double data[:, :, :]

data = MagicMemoryView(source_buffer, (24, 12, 25), "d")