Python Преобразует целое число в бит число определенной длины, быстро

Я пытаюсь дельта сжимать список пикселей и хранить их в двоичном файле. Мне удалось это сделать, но метод, который я нашел, занимает ~ 4 минуты кадра.

def getByte_List(self):
 values = BitArray("")
 for I in range(len(self.delta_values)):
 temp = Bits(int= self.delta_values[I], length=self.num_bits_pixel)
 values.append(temp)
 ##start_time = time.time()
 bit_stream = pack("****:16, ****:5, bits", self.intial_value, self.num_bits_pixel, values)
 ##end_time = time.time()
 ##print(end_time - start_time)

 # Make sure that the list of bits contains a multiple of 8 values
 if (len(bit_stream) % 8):
 bit_stream.append(Bits(****=0, length = (8-(len(bit_stream) % 8)))) #####Append? On a pack? (Only work on bitarray? bit_stream = BitArray("")

 # Create a list of unsigned integer values to represent each byte in the stream
 fmt = (len(bit_stream)/8) * ["****:8"]
 return bit_stream.unpack(fmt)

Это мой код. Я беру начальное значение, количество бит на пиксель и значения дельта и преобразую их в биты. Затем я байт выровняю и беру целочисленное представление байтов и использую его в другом месте. Проблемные области - это где я конвертирую каждое значение дельта в биты (3 мин) и где я упаковываю (1 мин). Можно ли делать то, что я делаю быстрее или иначе, чтобы упаковать их прямо в целые числа, представляющие байты.

1 ответ

Из быстрого Google классов, которые вы создаете, похоже, что вы используете модуль bitstring. Это написано на чистом Python, так что это не большой сюрприз, что он довольно медленный. Вы можете посмотреть одно или несколько из следующих:

  • struct - модуль, который поставляется с Python, который позволит вам упаковывать и распаковывать C-структуры в составные значения
  • bytearray - встроенный тип, который позволяет вам аккумулировать массив массивов байтов и имеет как похожие на список, так и строковые операции
  • bin(x), int(x, 2) - преобразование чисел в двоичное представление в виде строки, а манипуляции с обратной строкой иногда могут быть достаточно эффективным способом сделать это
  • bitarray - собственный (C) модуль для манипулирования бит, похоже, что он имеет аналогичную функциональность для bitstring но должен быть намного быстрее. Доступно здесь в форме, подходящей для компиляции в Linux или здесь предварительно скомпилированной для Windows.
  • numpy - быстрое манипулирование массивами различных типов, включая одиночные байты. Как бы то ни было. http://www.numpy.org/

licensed under cc by-sa 3.0 with attribution.