将二进制数据打包和解包到列表中的最快方法
Fastest way to pack and unpack binary data into list
我正在编写一个脚本,它将从数千个文件中读取 32 字节的数据。 32 字节由 8 对 16 位整数组成,我想将它们解压缩为 Python 整数以构建一个由平均数组成的列表。然后我想打印出列表的十六进制字符串(打包方式与解包方式相同),连同列表对象本身,给用户 运行 脚本。
我当前的代码看起来像这样,它比我希望的要慢(即使考虑到沉重的 I/O 负载):
import os
import sys
import struct
import binascii
def list_str(list):
return str(list)
def list_s16be_hex(list):
i = 0
bytes = b""
while i < len(list):
bytes += struct.pack(">h", list[i])
i += 1
return binascii.hexlify(bytes).decode("ascii")
def main():
averages = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
root = os.path.dirname(__file__)
for dirpath, dirnames, filenames in os.walk(root):
for filename in filenames:
with open(os.path.join(dirpath, filename), "rb") as f:
f.seek(0x10)
tmp = f.read(32)
i = 0
while i < 32:
averages[i//2] = (averages[i//2] + struct.unpack(">h", tmp[i:i+2])[0]) // 2
i += 2
print("Updated averages (hex): " + list_s16be_hex(averages))
print("Updated averages (list): " + list_str(averages))
return 0
if __name__=="__main__":
main()
有没有更有效的方法?
您可以使用 struct.unpack(">16h", tmp)
一次解压所有 16 个整数,这对于计算部分来说应该明显更快。否则我希望您的程序运行时间由 I/O 支配,您可以通过测量它的运行时间来检查它而无需平均计算。关于 I/O,您无能为力。
我正在编写一个脚本,它将从数千个文件中读取 32 字节的数据。 32 字节由 8 对 16 位整数组成,我想将它们解压缩为 Python 整数以构建一个由平均数组成的列表。然后我想打印出列表的十六进制字符串(打包方式与解包方式相同),连同列表对象本身,给用户 运行 脚本。
我当前的代码看起来像这样,它比我希望的要慢(即使考虑到沉重的 I/O 负载):
import os
import sys
import struct
import binascii
def list_str(list):
return str(list)
def list_s16be_hex(list):
i = 0
bytes = b""
while i < len(list):
bytes += struct.pack(">h", list[i])
i += 1
return binascii.hexlify(bytes).decode("ascii")
def main():
averages = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
root = os.path.dirname(__file__)
for dirpath, dirnames, filenames in os.walk(root):
for filename in filenames:
with open(os.path.join(dirpath, filename), "rb") as f:
f.seek(0x10)
tmp = f.read(32)
i = 0
while i < 32:
averages[i//2] = (averages[i//2] + struct.unpack(">h", tmp[i:i+2])[0]) // 2
i += 2
print("Updated averages (hex): " + list_s16be_hex(averages))
print("Updated averages (list): " + list_str(averages))
return 0
if __name__=="__main__":
main()
有没有更有效的方法?
您可以使用 struct.unpack(">16h", tmp)
一次解压所有 16 个整数,这对于计算部分来说应该明显更快。否则我希望您的程序运行时间由 I/O 支配,您可以通过测量它的运行时间来检查它而无需平均计算。关于 I/O,您无能为力。