本教程https://www.dataquest.io/blog/python-json-tutorial/有一个600 run的文件,它们可以使用,但是当我运行他们的代码时
import ijson
filename = "md_traffic.json"
with open(filename, 'r') as f:
objects = ijson.items(f, 'meta.view.columns.item')
columns = list(objects)我遇到了等待文件被读入ijson的10+分钟,我真的很困惑,这应该是合理的。不应该有解析吗?我是不是遗漏了什么?
发布于 2016-06-18 14:59:54
这看起来像是教程的直接拷贝/粘贴:
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,所以答案使用了在这两种情况下都起作用的语法,尽管这是不得体的。
发布于 2016-11-03 09:04:02
主要问题不是在解析后创建一个list (只将单个结果收集到一个结构中),而是使用ijson提供的默认纯python后端。
还有其他可以更快地使用的后端。在ijson主页中,将解释如何导入这些内容。yajl2_cffi后端是目前可用的最快的后端,但是我已经创建了一个新的yajl2_c后端(有一个拉请求等待验收),它的性能甚至更好。
在我的笔记本电脑(英特尔(R)Core(商标) i7-5600U)中,使用yajl2_cffi后端,您的代码运行时间约为1.5分钟。使用yajl2_c后端,它在~10.5秒(python 3)和~15秒(python2.7.12)内运行。
编辑:@lex-血汗砖当然也是对的,因为如果你只对列名感兴趣的话,你就可以迅速脱离循环。
发布于 2016-06-18 15:28:42
我试着运行你的代码,25分钟后我就把程序关掉了。所以是的,10分钟,它是合理的快速。
https://stackoverflow.com/questions/37898065
复制相似问题