在Python中将二进制数据字符串转换为数值的最快方法是什么?
我正在使用struct.unpack_from(),但是达到了性能限制.
上下文:传入流是混合二进制和ASCII数据.ASCII数据转换是通过ctypes在C中完成的.通过ctypes在C中实现解包产生了与解包相似的性能.我的猜测是呼叫开销太大了.我希望找到一种原生的类C强制方法(但不是Pythonic).很可能所有这些代码都需要转移到C.
流是网络字节顺序(big-endian),机器是little-endian.转换的示例是:
import struct
network_stream = struct.pack('>I', 0x12345678)
(converted_int,) = struct.unpack_from('>I', network_stream, 0)
Run Code Online (Sandbox Code Playgroud)
我不太关心处理流格式,而不是二进制转换的一般情况,如果有替代的话unpack.例如,socket.ntohl()需要一个int,并且int()不会转换二进制数据字符串.
谢谢你的建议!
速度问题可能不在struct.unpack_from()于其本身的实现,而在于Python需要做的其他事情——字典查找、创建对象、调用函数和其他任务。您可以通过直接导入而不是每次unpack_from从模块获取来消除这些字典查找之一,从而稍微加快速度:struct
$ python -m timeit -s "import struct; network_stream = struct.pack('>I', 0x12345678)" "(converted_int,) = struct.unpack_from('>I', network_stream, 0)"
1000000 loops, best of 3: 0.277 usec per loop
$ python -m timeit -s "import struct; from struct import unpack_from; network_stream = struct.pack('>I', 0x12345678)" "(converted_int,) = unpack_from('>I', network_stream, 0)"
1000000 loops, best of 3: 0.258 usec per loop
Run Code Online (Sandbox Code Playgroud)
但是,如果需要大量解析逻辑,需要一次解包一个数字,并且会阻止您批量解包整个数据数组,那么您调用什么来为您执行此操作并不重要。您可能需要使用开销较小的语言(例如 C)来完成整个内部循环。