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

时间:2015-03-14 11:34:06

标签: python io

我正在编写一个脚本,它将从数千个文件中读取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()

有更有效的方法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用struct.unpack(">16h", tmp)一次解压缩所有16个整数,这对于计算部分应该明显更快。否则,我希望您的程序运行时由I / O控制,您可以通过测量它的运行时来检查,而无需进行平均计算。关于I / O,您无能为力。