Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 导入dict与解析文本文件_Python_Dictionary - Fatal编程技术网

Python 导入dict与解析文本文件

Python 导入dict与解析文本文件,python,dictionary,Python,Dictionary,我有一个应用程序以键值格式将数据保存在磁盘上。文件可能会变得相当大。我想让我的python脚本读入这些数据,我想知道-如果我将这些数据格式化为有效的python dict{key1:value1,key2:value2…},然后导入该文件以使用它,与读入文本文件相比,这是否会带来显著的性能改进,将其拆分为key:value对并存储到dict中 感谢是存储类似dict的数据的标准方法,并且存在非常快速的读/写JSON数据的实现,例如python中的实现。尝试: 如果您可以降低文件格式的可读性,还可

我有一个应用程序以键值格式将数据保存在磁盘上。文件可能会变得相当大。我想让我的python脚本读入这些数据,我想知道-如果我将这些数据格式化为有效的python dict
{key1:value1,key2:value2…}
,然后导入该文件以使用它,与读入文本文件相比,这是否会带来显著的性能改进,将其拆分为
key:value
对并存储到dict中

感谢

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

如果您可以降低文件格式的可读性,还可以尝试使用(二进制JSON编码)。

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


如果您可以降低文件格式的可读性,还可以尝试使用(二进制JSON编码)。

在我的示例中,我假设,
dct
保存了我们要加载的字典

repr(dct)
将值以
repr(dct)
创建的字符串形式保存到文件中是一个选项

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

import ast
def fromdct(fname):
    with open(fname) as f:
        return ast.literal_eval(f.read())
从JSON文件加载dict 通过导入Python模块加载数据 假设data.py具有以下内容:

data = {"a": 11, "b": 22, ...large dictionary}
您可以通过以下方式读取数据:

from data import data
性能(从模块导入最快) 为了进行测试,我创建了一个包含一百万个键值对的字典:

>>> 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模块加载数据确实是最快的

可能的优化
  • 使用simpler
    json
    library可以更快
  • 将文件保存到gzip文件中-这可能会加快从磁盘读取的速度(不适用于从Python模块导入)
备选方案-在Redis中存储数据 您可能会遇到问题,如果字典中的数据量变大,它可能会占用太多内存。如果您必须从程序的多个实例中读取数据,这可能会变得至关重要

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

优点是:

  • 能够一个接一个地读取值,无需一次性加载到内存中
  • 能够在程序的多个实例之间共享数据
  • 若要在另一台服务器上运行Redis并通过TCP进行通信,则需要使用另一台计算机的内存
  • Redis将数据持久化到磁盘
  • 能够逐个键更改数据
缺点:

  • 必须安装Redis
  • 所有数据都在内存中(可以通过分区到多个实例来解析)
  • 在某些情况下(突然终止服务器),您可能会丢失配置中的最新更改
结论
  • 从Python模块加载是最快的方法
  • 从JSON加载效果很好
  • 通过ats加载。文字评估非常缓慢
  • 如果数据量较大,并且同时在多个程序中需要数据,那么使用Redis可能是一种解决方案

在我的示例中,我假设,
dct
保存我们要加载的字典

repr(dct)
将值以
repr(dct)
创建的字符串形式保存到文件中是一个选项

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

import ast
def fromdct(fname):
    with open(fname) as f:
        return ast.literal_eval(f.read())
从JSON文件加载dict 通过导入Python模块加载数据 假设data.py具有以下内容:

data = {"a": 11, "b": 22, ...large dictionary}
您可以通过以下方式读取数据:

from data import data
性能(从模块导入最快) 为了进行测试,我创建了一个包含一百万个键值对的字典:

>>> 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模块加载数据确实是最快的

可能的优化
  • 使用simpler
    json
    library可以更快
  • 将文件保存到gzip文件中-这可能会加快从磁盘读取的速度(不适用于从Python模块导入)
备选方案-在Redis中存储数据 您可能会遇到问题,如果字典中的数据量变大,它可能会占用太多内存。如果您必须从程序的多个实例中读取数据,这可能会变得至关重要

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

优点是:

  • 能够一个接一个地读取值,无需一次性加载到内存中
  • 能够在程序的多个实例之间共享数据
  • 若要在另一台服务器上运行Redis并通过TCP进行通信,则需要使用另一台计算机的内存
  • Redis将数据持久化到磁盘
  • 能够逐个键更改数据
缺点:

  • 必须安装Redis
  • 所有数据都在内存中(可以通过分区到多个实例来解析)
  • 在某些情况下(突然终止服务器),您可能会丢失配置中的最新更改
结论
  • 从Python模块加载是最快的方法
  • 从JSON加载效果很好
  • 通过ats加载。文字评估非常缓慢
  • 如果数据量较大,并且同时在多个程序中需要数据,那么使用Redis可能是一种解决方案

有多大?对于小于两兆的文件,仅从磁盘读取文件通常是限制因素。它是表格数据吗(然后使用HDF5)?有多大?对于小于两兆的文件,仅从磁盘读取文件通常是限制因素。是否为表格数据(然后使用HDF5)?