以下两种读取字节的方式有什么区别?
stream = BytesIO(unhexlify('000000010000'))
print(int.from_bytes(stream.read(4), byteorder="big")) //prints 1
bytes = unhexlify('000000010000')
print(int.from_bytes(bytes[:4], byteorder="big")) //prints 1
哪个更好?为什么?
如果你知道你的字符串是hex
字符串,为什么不直接将其转换为int
,base
为"16"?例如:
>>> my_hex = '000000010000'
>>> int(my_hex[:8], base=16)
1
您必须在这里注意,我将索引为"8"而不是 4 的字符串切片,但由于我们知道它是一个十六进制字符串,我们可以相应地切片它2
考虑到字符表示hex
数字。
以下是您的和矿山解决方案的性能比较:
mquadri$ python3 -m timeit "my_hex = '000000010000'; int(my_hex[:8], base=16)"
1000000 loops, best of 3: 0.581 usec per loop
mquadri$ python3 -m timeit -s "from io import BytesIO; from binascii import unhexlify" "stream = BytesIO(unhexlify('000000010000')); int.from_bytes(stream.read(4), byteorder='big')"
1000000 loops, best of 3: 1.15 usec per loop
mquadri$ python3 -m timeit -s "from binascii import unhexlify" "bytes = unhexlify('000000010000'); int.from_bytes(bytes[:4], byteorder='big')"
1000000 loops, best of 3: 0.764 usec per loop
如您所见,简单地使用int
进行转换比两种解决方案都更有效。
但是,如果您只对提到的解决方案感兴趣,那么我会建议不使用io.BytesIO
的解决方案,因为:
- 如果不使用
ByteIO
,您将需要较少的imports
- 相比之下,您的第二个解决方案看起来也更简单
注意:对于性能测量,我不计算导入时间,以防有人打算说"此差异与额外导入有关">;)
使用 IO 构造(StringIO
、BytesIO
)的目的是处理模仿流的对象(如文件)。因此,您的第一个解决方案是将字节包装在类似文件的对象中,并从该包装器中读取,就好像它是一个文件一样。第二个解决方案只是从字节中读取。
我说如果你的代码语义不要求字节是流,跳过IO解决方案直接转到源。