首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Python将大量浮点数存储在文件中的最佳方法?

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

Stack Overflow用户
提问于 2020-02-10 20:16:16
回答 2查看 855关注 0票数 1

我有一个程序,生成一个非常大的浮点数序列,通常是数千万左右。我需要一个很好的方法把它们保存在一个文件里。我将按顺序编写它们,并使用Python阅读它们。浮点数在一个一维数组中,如下所示:

代码语言:javascript
运行
复制
[39534.543, 834759435.3445643, 1.003024032, 0.032543, 434.0208...]

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

生成数字的代码:

代码语言:javascript
运行
复制
for x in range(16384):
    for y in range(16384):
        float = <equation with x and y>
        <write float to file>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-10 20:28:05

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

代码语言:javascript
运行
复制
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检索数组的值。

代码语言:javascript
运行
复制
with open('store', 'rb') as file:
    packed = file.read()
    array = unpack('d' * (len(packed) // 8), packed) # 8 bytes per double
票数 1
EN

Stack Overflow用户

发布于 2020-02-10 21:08:16

你的一些数字看起来太短了,不可能是随机的。因此,您可以通过压缩将它们存储在每个浮动中的小于8个字节。例如:

商店:

代码语言:javascript
运行
复制
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()))

负载:

代码语言:javascript
运行
复制
import lzma, ast

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

print(array)

即使有随机数据,我平均得到的字节也不到8个字节:

代码语言:javascript
运行
复制
>>> n = 10**5
>>> a = [random.random() for _ in range(n)]
>>> len(lzma.compress(repr(a).encode())) / n
7.98948

诚然,这是相当缓慢的,但至少对我的随机数据。对于非随机数据来说可能更快。或者尝试一个较低的压缩水平或其他压缩。pickle模块还提到了压缩,因此这可能值得一试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60157757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档