我正在尝试从位于某个URL的文件加载数据。我使用请求来获取它(这很快发生)。但是,使用r.json()来格式化部分字典大约需要10分钟。我怎样才能加快速度呢?
match_list = []
for i in range(1, 11):
r = requests.get('https://s3-us-west-1.amazonaws.com/riot-api/seed_data/matches%d.json' % i)
print('matches %d of 10 loaded' % i)
match_list.append(r.json()['matches'])
print('list %d of 10 created' % i)
match_histories = {}
match_histories['matches'] = match_list
我知道这里有一个相关问题:Performance problem transforming JSON data,但我不知道如何将其应用于我的案例。谢谢! (我使用的是Python 3)。
编辑:
我得到了很多看似有希望的建议,但每次都遇到了障碍。
我想尝试使用cjson,但我无法安装它(pip无法找到MS visual C ++ 10.0,尝试使用Lua进行一些安装,但我需要在我的路径中使用cl开始;)。
json.loads(r.content)在Python 3中导致TypeError。
我不确定如何让ijson工作。
ujson似乎与json
json.loads(r.text.encode(' utf-8')。decode(' utf-8'))也需要同样的时间
答案 0 :(得分:5)
内置的JSON解析器并不是特别快。我尝试了另一个解析器python-cjson,如下所示:
import requests
import cjson
r = requests.get('https://s3-us-west-1.amazonaws.com/riot-api/seed_data/matches1.json')
print cjson.decode(r.content)
整个程序在我的笔记本电脑上花了3.7秒,包括获取数据和格式化输出以供显示。
编辑:哇,我们都走错了路。 json
并不慢;请求的字符集检测速度非常慢。试试这个:
import requests
import json
r = requests.get('https://s3-us-west-1.amazonaws.com/riot-api/seed_data/matches1.json')
r.encoding = 'UTF-8'
print json.loads(r.text)
json.loads
部分在同一台笔记本电脑上需要1.5秒。这仍然比cjson.decode
慢(仅为.62秒),但可能足够快,以至于你不会在乎你经常运行的东西。警告:我只在Python2上对此进行了基准测试,在Python3上可能会有所不同。
编辑2:似乎cjson没有安装在Python3中。没关系:这个版本中的json.loads
只需要54秒。但是,字符集检测仍然是冰川,并且评论r.encoding = 'UTF-8'
仍然使测试脚本在O(永恒)时间内运行。如果你可以指望这些文件始终是UTF-8编码的,我认为性能秘诀是将这些信息放在你的脚本中,这样它就不必在运行时解决这个问题。有了这个提升,您就不必费心去提供自己的JSON解析器了。跑吧:
import requests
r = requests.get('https://s3-us-west-1.amazonaws.com/riot-api/seed_data/matches1.json')
r.encoding = 'UTF-8'
print r.json()
答案 1 :(得分:0)
我建议使用流式JSON解析器(看看ijson
)。流式处理方法可以提高解析步骤的内存效率,但是由于您在内存中存储了相当大的数据集,因此您的程序可能仍然很慢。
答案 2 :(得分:0)
那么你有一个非常大的文件和纯python代码(我怀疑请求库不使用C绑定进行JSON解析)通常很慢。你真的需要所有数据吗?如果您只需要它的某些部分,也许您可以找到更快的方法来查找它或使用不同的API(如果可用)。
您还可以尝试使用像ujson这样的库来使用更快的JSON库:https://pypi.python.org/pypi/ujson
我自己没有试过这个,但声称速度很快。然后,您只需致电ujson.loads(r.text)
即可获取数据。