本教程https://www.dataquest.io/blog/python-json-tutorial/有一个600MB的文件可供使用,但是当我运行他们的代码时
import ijson
filename = "md_traffic.json"
with open(filename, 'r') as f:
objects = ijson.items(f, 'meta.view.columns.item')
columns = list(objects)
我正在等待10分钟以上的文件被读入ijson,我真的很困惑这应该是合理的。不应该解析吗?我错过了什么吗?
答案 0 :(得分:2)
主要问题不是您在解析后创建list
(仅将单个结果收集到单个结构中),而是使用ijson提供的默认pure-python后端。
还有其他可以使用的后端更快。在ijson's homepage中解释了如何导入它们。 yajl2_cffi
后端是目前最快的,但我创建了一个新的yajl2_c
后端(有pull request等待接受),表现更好。
在使用yajl2_cffi
后端的笔记本电脑(Intel(R)Core(TM)i7-5600U)中,您的代码运行时间约为1.5分钟。使用yajl2_c
后端它运行〜10.5秒(python 3)和~15秒(python 2.7.12)。
编辑:@ lex-scarisbrick当然也是正确的,如果你只对列名感兴趣,你可以快速摆脱循环。
答案 1 :(得分:1)
这看起来像是在这里找到的教程的直接复制/粘贴:
https://www.dataquest.io/blog/python-json-tutorial/
list()
函数输出周围的ijson.items
之所以花费这么长时间。这有效地强制解析整个文件,然后返回任何结果。利用ijson.items
作为生成器,第一个结果几乎可以立即返回:
import ijson
filename = "md_traffic.json"
with open(filename, 'r') as f:
for item in ijson.items(f, 'meta.view.columns.item'):
print(item)
break
编辑:本教程的下一步是print(columns[0])
,这就是我在答案中打印第一项的原因。此外,目前还不清楚问题是针对Python 2还是3,所以答案使用的语法在两者中都有效,尽管不是很优秀。
答案 2 :(得分:1)
我尝试运行你的代码,我在25分钟后杀了程序。所以是10分钟,这是合理的快速。