为什么内置JSON构建器比显式JSON加载程序运行得更快?

为什么内置JSON构建器比显式JSON加载程序运行得更快?,json,python-2.7,python-requests,timeit,Json,Python 2.7,Python Requests,Timeit,我有一个web服务,它给了我巨大的json响应。在这里,我提供iPython代码片段 In [1]: import requests In [2]: r = requests.post("<API endpoint>", data={"number_of_row" : 10000000}) In [3]: r Out[3]: <Response [200]> In [4]: import json In [5]: %timeit json.loads(r.text

我有一个web服务,它给了我巨大的json响应。在这里,我提供iPython代码片段

In [1]: import requests

In [2]: r = requests.post("<API endpoint>", data={"number_of_row" : 10000000})

In [3]: r
Out[3]: <Response [200]>

In [4]: import json

In [5]: %timeit json.loads(r.text)
1 loop, best of 3: 36.5 s per loop

In [6]: %timeit r.json()
10 loops, best of 3: 121 ms per loop
需要注意的是,任何地方都没有实现
缓存。API端点由我控制

编辑#2:


requests.models.Response.json()
在内部使用
json.loads
(或
simplejson.loads
)。因此,除非您安装了
simplejson
,否则应该没有区别

我怀疑时差来自网络IO;一旦数据被提取,它就会被缓存。因此第二个(
r.json
)使用缓存的数据;花更少的时间

如果你颠倒调用顺序,你会得到相反的结果

编辑

< > >代码>请求。模型<代码>使用<代码> CARDET。检测< /COD>猜测响应的编码,而<代码>请求。模型。响应。jSORE()/代码>使用<代码>请求。UTILS。GuestyJSONUTF < /代码>只考虑<代码> UTF-8/COD>,<代码> UTF-16 < /代码>,<代码> UTF-32 < /代码>,根据JSON RFC 4627节3。

In [1]: content = 'a' * 1000000000

In [2]: import chardet

In [3]: %timeit chardet.detect(content)['encoding']
1 loops, best of 3: 9.6 s per loop

In [4]: import requests.utils

In [5]: %timeit requests.utils.guess_json_utf(content)
1000000 loops, best of 3: 835 ns per loop

我怀疑它是不存在的。因为当我解析响应时,n/w IO已经完成。这是纯粹的解析逻辑。另外,我用反向解析方法编辑了我的问题,请检查。@AashishP,这很奇怪。顺便说一句,缓存我的意思是在请求端,而不是服务器端。@AashishP,你能给它计时
json.loads(r.content.decode(requests.utils.guess_json\u utf(r.content))
<代码>响应。文本< /代码>使用代码> CARDET < /代码>,考虑所有可能的编码,而<代码>响应。JSON/<代码>使用UTF-8、UTF-16、UTF-32、@ AashishP、换句话说,<代码>请求。UTILS。GuestyJSONUTUF(..)<代码> VS <代码> CARDET。检测(…)[编码]
请选中编辑#2。你说得对。所以,下一个问题是,如果数据中有一些非utf字符,我不能选择
r.json()
In [18]: %timeit json.loads(r.content.decode(requests.utils.guess_json_utf(r.content)))
10 loops, best of 3: 119 ms per loop

In [19]: %timeit r.json()
10 loops, best of 3: 63.3 ms per loop

In [20]: %timeit json.loads(r.text)
1 loop, best of 3: 36.5 s per loop
In [1]: content = 'a' * 1000000000

In [2]: import chardet

In [3]: %timeit chardet.detect(content)['encoding']
1 loops, best of 3: 9.6 s per loop

In [4]: import requests.utils

In [5]: %timeit requests.utils.guess_json_utf(content)
1000000 loops, best of 3: 835 ns per loop