Python Json使用,Json库性能测试
介绍
官网:https://www.json.org/json-zh.html
中文介绍:https://www.json.cn/wiki.html
中文介绍:https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/JSON
JavaScript对象表示法(JSON)是用于将结构化数据表示为JavaScript对象的标准格式,通常用于在网站上表示和传输数据(例如从服务器向客户端发送一些数据,因此可以将其显示在网页上)。您会经常遇到它,所以在本文中,我们向您提供使用JavaScript处理JSON的所有工作,包括访问JSON对象中的数据项并编写自己的JSON。
什么是 JSON
JSON是一种按照JavaScript对象语法的数据格式,这是 Douglas Crockford 推广的。虽然它是基于 JavaScript 语法,但它独立于JavaScript,这也是为什么许多程序环境能够读取(解读)和生成 JSON。
JSON可以作为一个对象或者字符串存在,前者用于解读 JSON 中的数据,后者用于通过网络传输 JSON 数据。 这不是一个大事件——JavaScript 提供一个全局的 可访问的 JSON 对象来对这两种数据进行转换。
一个 JSON 对象可以被储存在它自己的文件中,这基本上就是一个文本文件,扩展名为 .json, 还有 MIME type 用于 application/json.
JSON 结构
我们已经可以推测出 JSON 对象就是基于 JavaScript 对象,而且这几乎是正确的。您可以把 JavaScript 对象原原本本的写入 JSON 数据——字符串,数字,数组,布尔还有其它的字面值对象。这允许您构造出一个对象树,如下:
{
"squadName" : "Super hero squad",
"homeTown" : "Metro City",
"formed" : 2016,
"secretBase" : "Super tower",
"active" : true,
"members" : [
{
"name" : "Molecule Man",
"age" : 29,
"secretIdentity" : "Dan Jukes",
"powers" : [
"Radiation resistance",
"Turning tiny",
"Radiation blast"
]
},
{
"name" : "Madame Uppercut",
"age" : 39,
"secretIdentity" : "Jane Wilson",
"powers" : [
"Million tonne punch",
"Damage resistance",
"Superhuman reflexes"
]
},
{
"name" : "Eternal Flame",
"age" : 1000000,
"secretIdentity" : "Unknown",
"powers" : [
"Immortality",
"Heat Immunity",
"Inferno",
"Teleportation",
"Interdimensional travel"
]
}
]
}
如果我们要加载对象进入 JavaScript 程序,以保存为一个名为 superHeroes 对象为例,我们使用 . 或 [] 访问对象内的数据(关于. 和 []概念,见 对象基础 )。如:
superHeroes.hometown
superHeroes["active"]
为了访问对象中的对象,您只需简单地链式访问(通过属性名和数组索引)。例如,访问 superHeroes 对象中的 members 数组对象的第二个元素的 powers 数组对象的第三个元素,您可以这样做:
superHeroes["members"][1]["powers"][2]
- 首先我们有变量名 superHeroes,储存对象 。
- 在对象中我们想访问 members 属性,所以我们使用 [“members”]。
- members 包含有对象数组,我们想要访问第二个元素,所以我们使用[1]。
- 在对象内,我们想访问 powers 属性,所以我们使用 [“powers”]。
- powers 属性是一个包含英雄技能的数组。我们想要第三个,所以我们使用[2]。
注:我们已经在 JSONText.html 实例中让JSON 对象进入变量中使其可访问(见源代码)。尝试加载它并且在您的浏览器*问对象数据。
JSON 数组
前面我们已经说过,”我们已经可以推测出 JSON 对象就是基于 JavaScript 对象,而且这几乎是正确的“——我们说几乎正确的原因是数组对象也是一种合法的 JSON 对象,例如:
[
{
"name" : "Molecule Man",
"age" : 29,
"secretIdentity" : "Dan Jukes",
"powers" : [
"Radiation resistance",
"Turning tiny",
"Radiation blast"
]
},
{
"name" : "Madame Uppercut",
"age" : 39,
"secretIdentity" : "Jane Wilson",
"powers" : [
"Million tonne punch",
"Damage resistance",
"Superhuman reflexes"
]
}
]
上面是完全合法的 JSON。您只需要通过数组索引就可以访问数组元素,如[0][“powers”][0]。
其他注意事项
- JSON 是一种纯数据格式,它只包含属性,没有方法。
- JSON要求在字符串和属性名称周围使用双引号。 单引号无效。
- 甚至一个错位的逗号或分号就可以导致 JSON 文件出错。您应该小心的检查您想使用的数据(虽然计算机生成的 JSON 很少出错,只要生成程序正常工作)。您可以通过像 JSONLint 的应用程序来检验 JSON。
- JSON 可以将任何标准合法的 JSON 数据格式化保存,不只是数组和对象。比如,一个单一的字符串或者数字可以是合法的 JSON 对象。虽然不是特别有用处……
- 与 JavaScript 代码中对象属性可以不加引号不同,JSON 中只有带引号的字符串可以用作属性。
用法
功能 | json | simplejson | ujson | orjson | rapidjson |
---|---|---|---|---|---|
dumps | ✔ | ✔ | ✔ | ✔ | ✔ |
loads | ✔ | ✔ | ✔ | ✔ | ✔ |
dump | ✔ | ✔ | ✔ | × | ✔ |
load | ✔ | ✔ | ✔ | × | ✔ |
函数 | 说明 |
---|---|
dumps | 将数据进行json格式编码 |
loads | 将json格式转换为python数据格式 |
dump | 将数据格式化为json写入文件 |
load | 从文件中读取json格式数据转换为python数据格式 |
json
dumps
s = {"a":1}
print(json.dumps(s), type(json.dumps(s)))
结果
{"a":1} <class 'str'>
loads
s = json.dumps({"a":1})
print(json.loads(s), type(json.loads(s)))
结果
{'a': 1} <class 'dict'>
dump
s = {"a":1}
with open('test.json', 'w') as f:
json.dump(s,f)
结果
cat test.json
{"a": 1}
load
s = {"a":1}
with open('test.json', 'r') as f:
print(json.load(f))
结果
{'a': 1}
ujson
dumps
s = [{"key": "value"}, 81, True]
print(ujson.dumps(s), type(ujson.dumps(s)))
结果
[{"key":"value"},81,true] <class 'str'>
loads
s = ujson.dumps([{"key": "value"}, 81, True])
print(ujson.loads(s), type(ujson.loads(s)))
结果
[{'key': 'value'}, 81, True] <class 'list'>
dump
s = [{"key": "value"}, 81, True]
with open('test.json', 'w') as f:
json.dump(s, f)
结果
# cat test.json
[{"key": "value"}, 81, true]
load
with open('test.json', 'r') as f:
print(json.load(f))
结果
[{'key': 'value'}, 81, True]
性能测试
Python 3.7.9
orjson 3.4.3
rapidjson 0.9.3
simplejson 3.17.2
ujson 4.0.1
dumps测试代码
# test.py
from time import time
import sys
import string
num = int(sys.argv[1])
libs = ['ujson','rapidjson','orjson','simplejson', 'json']
items = []
for i in range(num):
items.append({c:c for c in string.ascii_letters})
start = time()
for lib in libs:
if lib == 'ujson':
import ujson
ujson.dumps(items)
print("{} {} {}".format(lib, num, time() - start))
elif lib == 'rapidjson':
import rapidjson
rapidjson.dumps(items)
print("{} {} {}".format(lib, num, time() - start))
elif lib == 'orjson':
import orjson
orjson.dumps(items)
print("{} {} {}".format(lib, num, time() - start))
elif lib == 'simplejson':
import simplejson
simplejson.dumps(items)
print("{} {} {}".format(lib, num, time() - start))
else:
import json
json.dumps(items)
print("{} {} {}".format(lib, num, time() - start))
python test.py 100|1000|10000|100000|1000000
字符 | 100 | 1000 | 10000 | 100000 | 1000000 |
---|---|---|---|---|---|
ujson | 0.0070111751556396484 | 0.013962507247924805 | 0.06283235549926758 | 0.599773645401001 | 6.382662773132324 |
rapidjson | 0.014992237091064453 | 0.024962425231933594 | 0.10868263244628906 | 1.0209112167358398 | 10.831796169281006 |
orjson | 0.022938013076782227 | 0.03293967247009277 | 0.13959884643554688 | 1.2616758346557617 | 13.240594863891602 |
simplejson | 0.03992152214050293 | 0.05687665939331055 | 0.25530552864074707 | 2.3169126510620117 | 24.3010470867157 |
json | 0.04288482666015625 | 0.07180905342102051 | 0.37648797035217285 | 3.592233896255493 | 37.59800839424133 |
loads测试代码
# test.py
from time import time
import sys
import string
import ujson
num = int(sys.argv[1])
libs = ['ujson','rapidjson','orjson','simplejson', 'json']
items = []
for i in range(num):
items.append({c:c for c in string.ascii_letters})
items = ujson.dumps(items)
start = time()
for lib in libs:
if lib == 'ujson':
import ujson
ujson.loads(items)
print("{} {} {}".format(lib, num, time() - start))
elif lib == 'rapidjson':
import rapidjson
rapidjson.loads(items)
print("{} {} {}".format(lib, num, time() - start))
elif lib == 'orjson':
import orjson
orjson.loads(items)
print("{} {} {}".format(lib, num, time() - start))
elif lib == 'simplejson':
import simplejson
simplejson.loads(items)
print("{} {} {}".format(lib, num, time() - start))
else:
import json
json.loads(items)
print("{} {} {}".format(lib, num, time() - start))
python test.py 100|1000|10000|100000|1000000
字符 | 100 | 1000 | 10000 | 100000 | 1000000 |
---|---|---|---|---|---|
ujson | 0.001024007797241211 | 0.007979393005371094 | 0.055880069732666016 | 0.5894513130187988 | 5.998449802398682 |
rapidjson | 0.009002447128295898 | 0.02496647834777832 | 0.16159415245056152 | 1.592844009399414 | 15.948452949523926 |
orjson | 0.015984535217285156 | 0.043906450271606445 | 0.31914520263671875 | 3.038975715637207 | 31.38723111152649 |
simplejson | 0.03191375732421875 | 0.0638580322265625 | 0.41089892387390137 | 3.8348746299743652 | 39.75815176963806 |
json | 0.032938480377197266 | 0.07183051109313965 | 0.49071621894836426 | 4.6140758991241455 | 48.60541653633118 |
从测试结果来看不管是dumps和loads的性能都是ujson的速度快
本文地址:https://blog.csdn.net/weixin_43950678/article/details/109614137
推荐阅读
-
Python使用Flask实现RESTful API,使用Postman工具、requests库测试接口
-
python——使用yaml数据格式,PK --> XML,JSON
-
Python json模块使用实例
-
python利用requests库模拟post请求时json的使用
-
Python开发之序列化与反序列化:pickle、json模块使用详解
-
python使用response.read()接收json数据的实例
-
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
-
Python使用jsonpath-rw模块处理Json对象操作示例
-
Python XML转Json之XML2Dict的使用方法
-
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)