高效的字节查找表

时间:2019-03-27 11:45:52

标签: python performance lookup

我需要将原始字节解包为位。现在,我有一个原始数据和一个查询表。迭代输入数据以生成输出的最有效方法是什么?也许还有另一种方法可以做到这一点?

#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 个答案:

答案 0 :(得分:2)

结果证明我的猜测是完全错误的。但是评论中有如此有趣的读物。


在这里,我进行了两项小改进,希望可以稍微改善运行时性能。

首先,您的查找表将自然数作为键。这是一个列表。

<form>
 <input style="width: 300px; padding: 20px; cursor: pointer; box-shadow: 6px 6px 5px; #999; -webkit-box-shadow: 6px 6px 5px #999; -moz-box-shadow: 6px 6px 5px #999; font-weight: bold; background: #deebc9 ; color: #000; border-radius: 10px; border: 1px solid #999; font-size: 150%;" type="button" value="Log in" onclick="window.location.href='https://myURLExample/login'" />
</form>

第二,使用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

但是您可能也想测试这个问题的想法:

Converting integer to binary in python


也许这也符合您的需求,但是它提供列表而不是bstring。

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