Cython: оптимизировать родной вид памяти Python - PullRequest
0 голосов
/ 19 мая 2018

У меня есть функция (из внешней библиотеки Python), которая возвращает объект memoryview, который я хочу обработать в Cython.

Есть ли способ преобразовать его в типизированное представление памяти байтов (без копирования) для эффективности?И как бы я это сделал?Это не работает:

mv = memoryview(b'1234')
cdef char[:] *tmv
tmv = mv
     ^
------------------------------------------------------------

/home/me/.cache/ipython/cython/_cython_magic_f9f608355444e2d6828580906623cea8.pyx:3:6: Cannot convert Python object to '__Pyx_memviewslice *'

1 Ответ

0 голосов
/ 19 мая 2018

Этот ответ , связанный @CodeSurgeon, является возможностью сделать это.Тем не менее, начиная с Cython 0.28 у нас гораздо более понятный способ - типизированные только для чтения просмотров памяти:

%%cython
mv = memoryview(b'1234')
cdef const unsigned char[:] tmv=mv  #"const" is possible since Cython 0.28

Очевидно, что вы можете читать только из этого обзора памяти (это хорошо) икопирование не требуется.

Вы также можете сказать: но это unsigned char, а не char!Правда - это тоже хорошо: bytes - это unsigned char s, и весь смысл типизированных представлений памяти в том, что вы не путаете типы!

Еще одна причина, по которой я думаю, что связанное решение - это своего родаопасно - у вас есть вся сила C, чтобы выстрелить себе в ногу, потому что он отбрасывает типы и константность.См. Например:

%%cython    
def bad_things(a):
   cdef const unsigned char[:] safe=a
   cdef char *unsafe=<char *> &safe[0] #who needs const and types anyway?
   unsafe[0]=52   #replace through `4`

А теперь:

 >>> A=b'a'
 >>> bad_things(A)
 >>> print(A)   #take it Python - I pwned your immutability!
 b'4'
 >>> print(b'a')
 b'4'
 >>> #Help! What are you doing Python?

Поскольку в Python есть пул небольших строк, которые являются неизменяемыми (или так думает Python), и мы изменилиобъект, с которым b'a' связан с b'4', мы должны подготовиться к забавным результатам и счастливой отладке ...

В целом, это не составляет труда: придерживаться типизированных представлений памяти, которые гарантируют тип иконстантность-безопасности.

...