将二进制数据打包和解包到列表中的最快方法

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,您无能为力。