如何在将大量字节写入文件时提高性能?

时间:2017-11-06 17:37:13

标签: python performance optimization

在python中,我有一个巨大的浮点值列表(近3000万个值)。我必须将它们中的每一个转换为小端格式的4字节值,并按顺序将所有这些值写入二进制文件。

对于包含数千甚至100k数据的列表,我的代码工作正常。但是如果数据增加,则需要时间来处理和写入文件。我可以使用哪些优化技术更有效地写入文件?

正如this博客中所建议的那样,我正在使用bytearray替换对文件的所有小写。但是,表现仍然不尽如人意。

此外,我尝试过多处理(concurrent.futures.ProcessPoolExecutor())来利用系统中的所有内核,而不是使用单个CPU内核。但是仍然需要更多的时间来完成执行。

任何人都可以就如何提高此问题的性能(就时间和内存而言)给出更多建议。

这是我的代码:

def process_value (value):
    hex_value =  hex(struct.unpack('<I', struct.pack('<f', value))[0])
    if len(hex_value.split('x')[1]) < 8:
        hex_value = hex_value[:2] + ('0' * (8 - len(hex_value.split('x')[1]))) + hex_value[2:]

    dec1 = int( hex_value.split('x')[1][0] + hex_value.split('x')[1][1], 16)
    dec2 = int(hex_value.split('x')[1][2]+hex_value.split('x')[1][3],16)
    dec3 = int(hex_valur.split('x')[1][4]+hex_value.split('x')[1][5],16)
    dec4 = int(hex_value.split('x')[1][6]+hex_value.split('x')[1][7],16)
    msg = bytearray( [dec4,dec3,dec2,dec1] )
    return msg

def main_function(fp, values):
    msg = bytearray()
    for val in values:
        msg.extend (process_value(val))
    fp.write(msg)

1 个答案:

答案 0 :(得分:2)

您可以在编写之前尝试转换所有浮点数,然后一次性写入结果数据:

import struct    

my_floats = [1.111, 1.222, 1.333, 1.444]    

with open('floats.bin', 'wb') as f_output:
    f_output.write(struct.pack('<{}f'.format(len(my_floats)), *my_floats))

对于您拥有的值,您可能需要在大块中执行此操作:

import struct    

def blocks(data, n):
    for i in xrange(0, len(data), n):
        yield data[i:i+n]

my_floats = [1.111, 1.222, 1.333, 1.444]    

with open('floats.bin', 'wb') as f_output:
    for block in blocks(my_floats, 10000):
        f_output.write(struct.pack('<{}f'.format(len(block)), *block))

struct.pack()的输出应采用正确的二进制格式,以便直接写入文件。该文件必须以二进制模式打开,例如使用wb