python - 使用 .json() 格式化性能问题

标签 python json python-3.x

我正在尝试从位于某个 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/

相关文章:

python - 如果 Firefox 实例已经打开,selenium 会抛出错误

python - 使用 fileConfig 在 Python 中配置自定义处理程序

python - 如何编写要求用户同时使用字母和数字进行输入的输入?

json - 在 Swift 中检查 Firebase 快照是否等于 nil

javascript - JSONP 脚本返回 MIME 类型错误

javascript - 如何从angularjs中的json获取特定的唯一值

python - 如何使用 pymongo 将精确匹配词传递给 mongodb 查询?

python - 在 Numpy 中计算每个类的非零条目数

python - ServiceNow GlideRecord sysparm_query Python

python-3.x - 在Python中求三点之间的角度的问题