当前位置: 移动技术网 > IT编程>开发语言>JavaScript > Python Json使用,Json库性能测试

Python Json使用,Json库性能测试

2020年11月11日  | 移动技术网IT编程  | 我要评论
介绍官网:https://www.json.org/json-zh.html中文介绍:https://www.json.cn/wiki.html中文介绍:https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/JSONJavaScript对象表示法(JSON)是用于将结构化数据表示为JavaScript对象的标准格式,通常用于在网站上表示和传输数据(例如从服务器向客户端发送一些数据,因此可以将其显示在网页上)。您会经常遇到它

介绍

官网: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]。

注:我们已经在 实例中让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 很少出错,只要生成程序正常工作)。您可以通过像 的应用程序来检验 JSON。
  • JSON 可以将任何标准合法的 JSON 数据格式化保存,不只是数组和对象。比如,一个单一的字符串或者数字可以是合法的 JSON 对象。虽然不是特别有用处……
  • 与 JavaScript 代码中对象属性可以不加引号不同,JSON 中只有带引号的字符串可以用作属性。

用法

功能jsonsimplejsonujsonorjsonrapidjson
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
字符1001000100001000001000000
ujson0.00701117515563964840.0139625072479248050.062832355499267580.5997736454010016.382662773132324
rapidjson0.0149922370910644530.0249624252319335940.108682632446289061.020911216735839810.831796169281006
orjson0.0229380130767822270.032939672470092770.139598846435546881.261675834655761713.240594863891602
simplejson0.039921522140502930.056876659393310550.255305528640747072.316912651062011724.3010470867157
json0.042884826660156250.071809053421020510.376487970352172853.59223389625549337.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
字符1001000100001000001000000
ujson0.0010240077972412110.0079793930053710940.0558800697326660160.58945131301879885.998449802398682
rapidjson0.0090024471282958980.024966478347778320.161594152450561521.59284400939941415.948452949523926
orjson0.0159845352172851560.0439064502716064450.319145202636718753.03897571563720731.38723111152649
simplejson0.031913757324218750.06385803222656250.410898923873901373.834874629974365239.75815176963806
json0.0329384803771972660.071830511093139650.490716218948364264.614075899124145548.60541653633118

从测试结果来看不管是dumps和loads的性能都是ujson的速度快

本文地址:https://blog.csdn.net/weixin_43950678/article/details/109614137

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网