我正在尝试从位于某个 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 中导致类型错误。
我不确定如何让 ijson 工作。
ujson 似乎和 json 一样长
json.loads(r.text.encode('utf-8').decode('utf-8')) 也需要同样长的时间
最佳答案
内置的 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
并不慢; Requests 的字符集检测非常慢。试试这个:
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: Python3 中似乎没有安装 cjson。没关系:此版本中的 json.loads
只需要 0.54 秒。不过,字符集检测仍然很缓慢,注释 r.encoding = 'UTF-8'
仍然会使测试脚本在 O(eternal) 时间内运行。如果您可以指望这些文件始终采用 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()
关于python - 使用 .json() 格式化性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32016218/