我正在编写一个脚本,它将从数千个文件中读取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()
有更有效的方法吗?
答案 0 :(得分:2)
您可以使用struct.unpack(">16h", tmp)
一次解压缩所有16个整数,这对于计算部分应该明显更快。否则,我希望您的程序运行时由I / O控制,您可以通过测量它的运行时来检查,而无需进行平均计算。关于I / O,您无能为力。