使用 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
模块还提到了压缩,因此值得一试。
我有一个程序可以生成非常大的浮点数序列,通常约为数千万。我需要一种将它们存储在文件中的好方法。我将按顺序编写它们,并使用 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
模块还提到了压缩,因此值得一试。