Эффективная таблица поиска для байтов - PullRequest
1 голос
/ 27 марта 2019

Мне нужно развернуть необработанные байты в биты. Теперь у меня есть необработанные данные и справочная таблица. Каков наиболее эффективный способ перебора входных данных для генерации вывода? Или, может быть, есть другой способ сделать это?

#Look up table looks something like this.
lookup = {
  0: b'\x00\x00\x00\x00\x00\x00\x00\x00',
  1: b'\x00\x00\x00\x00\x00\x00\x00\x01',
  2: b'\x00\x00\x00\x00\x00\x00\x01\x00',
  ...
  255: b'\x01\x01\x01\x01\x01\x01\x01\x01',
}

def remap(data):
  out = [lookup(byte) for byte in data]
  row = b''.join(out)

Вот функции, которые занимают больше всего времени:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
44000    2.843    0.000    2.843    0.000 main.py:59(<listcomp>)
44007    0.593    0.000    0.593    0.000 {method 'join' of 'bytes' objects}

1 Ответ

2 голосов
/ 27 марта 2019

Оказывается, мои догадки совершенно неверны.Но в комментариях есть интересные сведения о том, почему они таковы.


Здесь я приведу два тривиальных улучшения, которые, мы надеемся, могут немного улучшить производительность во время выполнения.

Во-первых, ваша справочная таблица имеетнатуральные числа в качестве ключей.Это список.

lookup = [
  b'\x00\x00\x00\x00\x00\x00\x00\x00',
  b'\x00\x00\x00\x00\x00\x00\x00\x01',
  b'\x00\x00\x00\x00\x00\x00\x01\x00',
  ...
  b'\x01\x01\x01\x01\x01\x01\x01\x01',
]

Во-вторых, вместо создания списка и последующего ввода его для присоединения используйте generator.

def remap(data):
    return b''.join(lookup[byte] for byte in data)

Но вы можете проверить идеи вэтот вопрос также:

Преобразование целого числа в двоичное в python


Возможно, это также соответствует вашим потребностям, но дает список вместо bstring.

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.unpackbits.html#numpy.unpackbits

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...