运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

Python json使用,json库性能测试

运维开发网 https://www.qedev.com 2020-11-14 08:26 出处:51CTO 作者:wichandy
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]
  1. 首先我们有变量名 superHeroes,储存对象 。
  2. 在对象中我们想访问 members 属性,所以我们使用 ["members"]。
  3. members 包含有对象数组,我们想要访问第二个元素,所以我们使用[1]。
  4. 在对象内,我们想访问 powers 属性,所以我们使用 ["powers"]。
  5. 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的速度快

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消