使用 Python 在文件中存储大量浮点数的最佳方法?

Best way to store a large amount of floats in a file with Python?

我有一个程序可以生成非常大的浮点数序列,通常约为数千万。我需要一种将它们存储在文件中的好方法。我将按顺序编写它们,并使用 Python 阅读它们。浮点数是这样的一维数组:

[39534.543, 834759435.3445643, 1.003024032, 0.032543, 434.0208...]

(这些数字是例子,我只是用键盘捣碎来制作它们。)

生成数字的代码:

for x in range(16384):
    for y in range(16384):
        float = <equation with x and y>
        <write float to file>

您可以使用 struct.pack 函数将浮点数存储为 64 位双精度数:

from struct import pack, unpack

array = [39534.543, 834759435.3445643, 1.003024032, 0.032543, 434.0208]

with open('store', 'wb') as file:
    file.write(pack('d' * len(array) , *array))

以便您稍后可以使用 struct.unpack:

检索数组的值
with open('store', 'rb') as file:
    packed = file.read()
    array = unpack('d' * (len(packed) // 8), packed) # 8 bytes per double

您的某些号码看起来太短,不是随机的。因此,您可以将它们存储在 小于 每个浮点数压缩的 8 个字节中。例如:

商店:

import lzma

array = [39534.543, 834759435.3445643, 1.003024032, 0.032543, 434.0208]

with open('store', 'wb') as file:
    file.write(lzma.compress(repr(array).encode()))

加载:

import lzma, ast

with open('store', 'rb') as file:
    array = ast.literal_eval(lzma.decompress(file.read()).decode())

print(array)

即使是随机数据,我得到的平均也少于 8 个字节:

>>> n = 10**5
>>> a = [random.random() for _ in range(n)]
>>> len(lzma.compress(repr(a).encode())) / n
7.98948

诚然,它相当慢,但至少对于我的随机数据而言。对于非随机数据可能更快。或者可以尝试较低的压缩级别或其他压缩之一。 pickle 模块还提到了压缩,因此值得一试。