массив Cython в режиме чистого Python - PullRequest
0 голосов
/ 20 октября 2018

Я хочу распаковать столбчатые данные, поступающие через сокет - кучу целых чисел, затем кучу чисел с плавающей точкой и т. Д., Так что это быстрее, чем с struct.unpack

Я думал об использовании массива Cython, но не смог найти, как использовать его в обычном скрипте Python, так как в примере с Python используется from cpython cimport array

Мне было интересно, возможно ли определить массив Cython в режиме чистого Python (что-то похожее наcython.locals), и если да, то как.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Мой запрос был о десериализации столбчатых данных с минимальными издержками.

Я нашел решение в чистом Python для меня с помощью просмотра памяти, используя опцию cast ():

from struct import pack, unpack

# Generate sample packed data
# data = 1,2
# pack('2i', *data)
# Result: b'\x01\x00\x00\x00\x02\x00\x00\x00'

# Unpack sample columnar data coming from socket
socket_data = b'\x01\x00\x00\x00\x02\x00\x00\x00'
memoryview(socket_data ).cast('i').tolist()
# Result: [1,2]

Это позволяетсоздайте просмотр памяти один раз, а затем распакуйте данные кусками, если необходимо.

0 голосов
/ 20 октября 2018

Cython может обрабатывать массивы типа C (то есть указатель на область памяти) и типизированные просмотры памяти .На практике представления памяти соответствуют массивам NumPy или объектам буфера .

Массивам типа C трудно управлять вручную, тогда как массивы NumPy более удобны с точки зрения управления памятью.На практике производительность массивов / объектов памяти / буферных объектов NumPy такая же, как и при хранении данных, в любом случае выполняется «а-ля C» (указатель на область памяти), я настоятельно рекомендую управлять данными с помощью NumPy и передаватьэто вокруг.Любой код Cython или Python, осведомленный о буферном протоколе с разрешением вычислений на скорости C, при условии, что вычислительный код - Cython / C / C ++.

...