Упаковка целых чисел и операций с плавающей точкой в ​​bytearray для отправки через сокет - PullRequest
0 голосов
/ 10 октября 2018

Я хочу передать bytearray из Python, используя Socket, в мое C-приложение.Таким образом, мой bytearray должен состоять из 1000 элементов, которые будут упакованы следующим образом: целое число, число с плавающей запятой, целое число, число с плавающей запятой ... и т.д.

В настоящее время я делаю следующее:

bytes = bytearray()
for k in range(0, 500):
   bytes += struct.pack("i", integer_number)
   bytes += struct.pack("f", float_number)

Но я думаю, что это занимает много времени, потому что каждый раз, когда выполняется «+ =», создается новый массив, значения копируются в новый байтовый массив, а затем добавляется новое значение.Я прав?

Так есть ли более быстрый подход для этого?Например, мои значения, которые необходимо преобразовать в bytearray, хранятся в списке, поэтому я могу как-то быстрее создать bytearray из этих значений?

1 Ответ

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

Вы можете использовать struct.pack_into для помещения данных в предварительно выделенный буфер:

import struct

number_of_pairs = 500
ints = range(number_of_pairs)
floats = map(float, ints)

fmt = '!if'

st = struct.Struct(fmt)

binary = bytearray(number_of_pairs * st.size)

for offset, i, f in zip(range(0, len(binary), st.size), ints, floats):
  st.pack_into(fmt, binary, offset, i, f)

for pair in struct.iter_unpack(fmt, binary):
  print(pair)

Эта версия работает в 1,96 раза быстрее на моем компьютере.

...