В попытке ускорить struct.pack()
у меня есть следующее, чтобы упаковать int в байты:
import cython as c
from cython import nogil, compile, returns, locals, cfunc, pointer, address
int_bytes_buffer = c.declare(c.char[400], [0] * 400)
@locals(i = c.int, num = c.int)
@returns(c.int)
@cfunc
@nogil
@compile
def int_to_bytes(num):
i = 0
while num >0:
int_bytes_buffer[i] = num%256
num//=256
i+=1
return int_bytes_buffer[0]
int_to_bytes(259)
Я пытаюсь заставить это работать со списком целых, сследующий неправильный код:
@locals(i = c.int, ints_p = pointer(c.int[100]), num = c.int)
@returns(c.int)
@cfunc
@nogil
@compile
def int_to_bytes(num):
i = 0
for num in ints_p:
while num >0:
int_bytes_buffer[i] = num%256
num//=256
i+=1
return int_bytes_buffer[0]
ints = c.declare(c.int[100], [259]*100)
int_to_bytes(address(ints))
, который дает мне:
for num in ints_p:
^
----------------------------------------------------------
Accessing Python global or builtin not allowed without gil
Очевидно, я не должен использовать in
или циклически перемещаться по указателю.
Как я могу перебрать массив списков внутри функции?
РЕДАКТИРОВАТЬ :
Я пытаюсь передать указатель намассив целых чисел для функции, и он работает без gil, чтобы его можно было распараллелить.
Параметр функции должен был быть ints_p:
@locals(ints_p = pointer(c.int[100]), i = c.int, num = c.int)
@returns(c.int)
@cfunc
@nogil
@compile
def int_to_bytes(ints_p):
i = 0
for num in (*ints_p):
while num >0:
int_bytes_buffer[i] = num%256
num//=256
i+=1
return int_bytes_buffer[0]
ints = c.declare(c.int[100], [259]*100)
int_to_bytes(address(ints))
, и я хочу перебрать действительные целые числа и упаковать их (без gil)
РЕДАКТИРОВАТЬ 2 :
Мне известно о struct.pack
. Я хочу сделать распараллеливаемый вариант с Cython и nogil
.