gpt4 book ai didi

python - Python 中的快速二进制数据转换

转载 作者:太空狗 更新时间:2023-10-30 00:08:15 27 4
gpt4 key购买 nike

在 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)

我不太关心处理流格式,而是二进制转换的一般情况,甚至是否有 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

但是,如果需要大量的解析逻辑需要一次解包一个数字,并且会阻止您批量解包整个数据数组,那么调用它来做什么并不重要你。您可能需要使用开销较少的语言(例如 C)来执行整个内部循环。

关于python - Python 中的快速二进制数据转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8145167/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com