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

时间:2015-08-14 18:06:59

标签: 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中导致TypeError。

  • 我不确定如何让ijson工作。

  • ujson似乎与json

  • 一样长
  • json.loads(r.text.encode(' utf-8')。decode(' utf-8'))也需要同样的时间

3 个答案:

答案 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)即可获取数据。