导入dict vs解析文本文件

时间:2014-05-18 05:51:29

标签: python dictionary

我有一个应用程序以键值格式在磁盘上保存数据。该文件可能会变得相当大。我希望我的python脚本读取这些数据,我想知道 - 如果我将此数据格式化为有效的python dict {key1:value1,key2:value2...}然后导入文件以使用它,那么与阅读相比,这会带来任何显着的性能提升吗在文本文件中,将其拆分为key:value对并将其存储到dict中?

由于

2 个答案:

答案 0 :(得分:4)

JSON是存储类似dict的数据的标准方法,并且存在非常快速的读/写JSON数据的实现,例如,在python' s standard library中。尝试:

import json
with open(f) as F:
    data = json.load(F)

如果您可以破坏文件格式的人类可读性,您也可以尝试使用BSON(二进制JSON编码)。

答案 1 :(得分:1)

在我的示例中,我将假设dct包含我们要加载的词典。

repr(dct)

加载字典

repr(dct)创建的字符串中的值保存到文件中是一种选择。

此文件可以通过以下方式加载:

import ast
def fromdct(fname):
    with open(fname) as f:
        return ast.literal_eval(f.read())

从JSON文件加载dict

import json
def fromjson(fname):
    with open(fname) as f:
        return json.load(f)

通过导入Python模块

加载数据

假设 data.py 包含以下内容:

data = {"a": 11, "b": 22, ...large dictionary}

您可以通过

阅读数据
from data import data

性能(从模块导入最快)

为了进行测试,我创建了一个包含100万个键值对的字典:

>>> dct = {"a" + str(i): for i in range(1000000)}

序列化(跳过此处)

和将数据转换为变量所需的测量时间:

>>> %timeit fromdct("data.dct")
1 loops, best of 3: 5.21 s per loop
>>> %timeit fromjson("data.json")
1 loops, best of 3: 773 ms per loop
>>> %timeit from data import data
1 loops, best of 3: 2.15 µs per loop

正如我们所见,从Python模块加载数据真的很快

可能的优化

  • 使用更简单的json库,这些可以更快
  • 将文件保存到gzipped文件中 - 这可能会加速从磁盘读取(不适用于从Python模块导入)

替代方案 - 在Redis中存储数据

如果字典中的数据量变大,可能会遇到问题,可能会占用太多内存。如果您必须从程序的多个实例中读取数据,这可能会变得至关重要。

在这里,Redis可能有所帮助。它允许存储键值对,其中值总是一些二进制数据。您必须通过pickle或JSON序列化它们。

优点是:

  • 逐个读取值的能力,无需一次性加载到内存中
  • 在多个程序实例之间共享数据的能力
  • 可以在另一台服务器上运行Redis并通过TCP进行通信,使用另一台计算机的内存
  • Redis将数据保存到磁盘
  • 按键更改数据密钥的能力

缺点:

  • 必须安装Redis
  • 所有数据都在内存中(可以通过分区到多个实例来解析)
  • 在某些情况下(突然终止服务器),您可能会丢失配置中的最新更改

结论

  • 从Python模块加载是最快的方法
  • 从JSON加载效果很好
  • ats.literal_eval加载非常慢
  • 如果数据量较大且一次需要多个程序中的数据,则使用Redis可能是解决方案。