问题

前面刚总结了,利用jsonpath可以快速访问和设置json对象节点值的帖子。没想到这么快就打脸了。python的jsonpath居然性能如此之差,简直无法接受。

今天其实就是抛一个问题,作为记录,希望后续能够找到解决之道。

方案

利用python装饰器,可以轻松写一个记录函数执行时间的功能。代码如下:

import time

from functools import wraps

def exec_time():

def decorator(func):

@wraps(func)

def wrapper(*args, **kwargs):

beg = time.time() * 1000

ret = func(*args, **kwargs)

end = time.time() * 1000

print('func:{%s} exec time is:{%.5f} ms' % (func.__name__, end - beg))

return ret

return wrapper

return decorator

回到jsonpath问题上来,简单写了一个设置节点值的代码,如下:

js = {'a': 10, 'b': 20, 'c': {'e': 10, 'f': 'string'}, 'c1': {'e': 10, 'f': 'string'}, 'c2': {'e': 10, 'f': 'string'}}

JsonHelper(js).set('e', 20)

JsonHelper(js).get('e')

JsonHelper(js).set('e', 30)

JsonHelper(js).get('e')

JsonHelper(js).set('e', 40)

JsonHelper(js).get('e')

JsonHelper(js).set('e', 50)

JsonHelper(js).get('e')

输出为:

func:{set} exec time is:{9.77808} ms

func:{get} exec time is:{7.33887} ms

func:{set} exec time is:{6.12109} ms

func:{get} exec time is:{6.15625} ms

func:{set} exec time is:{5.82568} ms

func:{get} exec time is:{5.17139} ms

func:{set} exec time is:{4.96606} ms

func:{get} exec time is:{4.96899} ms

这么简单的json节点set和get,居然要接近10ms级别。再对比python对象的直接访问:

@exec_time()

def op_dict(data, field):

data[field] = 20

return data

输出:

func:{op_dict} exec time is:{0.00122} ms

python直接访问,性能居然相差千遍以上。jsonpath-ng的性能确实很差,库的实现有问题。不死心,又找到另外两个jsonpath库,一个就是jsonpath,一个是jsonpath-rw,再次验证性能:

import jsonpath

@exec_time()

def test_jsonpath(data, field):

return jsonpath.jsonpath(data, field)

from jsonpath_rw import parse as parserw

@exec_time()

def test_jsonpathrw(data, field):

jsonpath_expr = parserw(field)

return jsonpath_expr.find(data)

js = {'a': 10, 'b': 20, 'c': {'e': 10, 'f': 'string'}, 'c1': {'e': 10, 'f': 'string'}, 'c2': {'e': 10, 'f': 'string'}}

print(test_jsonpath(js, '$..e'))

print(test_jsonpathrw(js, '$..e'))

输出为:

func:{test_jsonpath} exec time is:{0.57471} ms

func:{test_jsonpathrw} exec time is:{5.48584} ms

结果很明显,jsonpath比jsonpath-ng性能相差10倍,但也并不算很好,与原始的json对象直接访问近100倍性能之差。jsonpath-rw的性能和jsonpath-ng差不多,实际上jsonpath-ng就是基于jsonpath-rw改造的。可惜jsonpath还不支持节点设置功能,jsonpath也不是好的选择。

讨论

本文中的exec_time装饰器,可以作为日常开发调测的工具箱中,尤其是引用第三方库的时候,需要及时验证下性能问题。

对于jsonpath,目前第三方库中确实难以找到合适的库可以使用。期待库的作者能够意识到性能问题并修复。后面的方向,找一下c语言的jsonpath库,试一试集成到python中,规避性能问题。

python jsonpath效率低_Python学习:jsonpath的性能问题相关推荐

  1. python多线程效率低_Python 多进程、多线程效率比较

    Python 界有条不成文的准则: 计算密集型任务适合多进程,IO 密集型任务适合多线程.本篇来作个比较. 通常来说多线程相对于多进程有优势,因为创建一个进程开销比较大,然而因为在 python 中有 ...

  2. python从入门到_Python学习路线从入门到上手,如何快速Python学习?

    因为清晰易读的风格,广泛的适用性,Python已经成为最受欢迎的编程语言之一.在TIOBE 排行榜中位居第四,是名副其实的人工智能第一语言. 风靡的另一个原因是,Python有非常多的第三方库.比如用 ...

  3. python开发效率怎样_Python 的开发效率真的比 Java高吗?

    真的比Java高很高. 几个例子. 爬虫领域,几年前就用Scrapy抓百度,新浪,股吧等各种东西. 五分钟写好一个小爬虫,爽到暴有没有?当年我就是靠教人写爬虫...才骗到小妹妹跟我约会的. 文本处理, ...

  4. python时间复杂度怎么算_python学习:算法和时间复杂度

    python学习:算法和时间复杂度 算法 什么是算法? 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制. 算法也可以 ...

  5. 我学python前一句_Python学习教程:人生苦短,我用Python?入门前你要知道这些

    有多少伙伴是因为一句'人生苦短,我用Python'就要去学Python的?之前也大家更新过Python学习教程普及过多次的Python相关知识,不过大家还是还得计划一下Python学习路线!Pytho ...

  6. python用法查询笔记_Python学习笔记 - 2 - PyCharm的基本使用

    什么是IDE 开始学习的小白同学,一看到这三个字母应该是懵逼的,那么我们一点一点来说. 既然学习Python语言我们就需要写代码,那么代码写在哪里呢?在记事本里写 在word文档里写 在sublime ...

  7. 自学python 编程基础知识_python学习-基础知识-1

    1.计算机历史 计算机使用高低电压的两种状态来描述信息.计算机可以理解的只有二进制数据即010100011....,1个比特位可以表示的状态只有2种,n个比特位可以表示的状态有2的n次方种. 所以如果 ...

  8. 流浪的python博客园_python学习心得第一章

    初始python 1什么是程序 计算机程序是一组执行某种动作的的指令.和那些电路.芯片.显卡.硬盘等不同,它不是计算机本身可以触摸的部分,而是隐藏在背后运行在硬件上面的东西.程序就是一系列告诉没有知觉 ...

  9. [转载] python numpy 子数组_Python学习笔记3:Numpy入门

    参考链接: Python中的numpy.logaddexp2 参考<Python:数据科学手册>一书,仅作个人学习及记录使用,若有侵权,请联系后台删除. 1 理解Python中的数据类型 ...

最新文章

  1. [洛谷3811]【模板】乘法逆元
  2. 1、MySQL数据类型简介
  3. movzbl和movsbl
  4. 教你学会Linux/Unix下的vi文本编辑器
  5. [转]Eclipse Java注释模板设置详解
  6. textaligncenter仍然不居中_三星Galaxy S21/S21+保护膜曝光:居中挖孔 回归直屏_手机行情...
  7. java 重载 大于_详解java重载与覆写的区别
  8. Remote Desktop Connection Manager2.7 安装+基本使用
  9. python如何下载pdfminer_在python中使用PDFMiner从PDF文件中提取文本?
  10. spark graphx的Triangle三角形计数算法使用示例
  11. DNS劫持怎么办、如何修复DNS劫持?DNS劫持怎么修复
  12. 桂电计算机专业2021推免人数,2021届计算机科学与技术学院推免公示
  13. OpenCV简单实现PhotoShop图层混合
  14. (Docker实战)在CentOS7上使用Docker;(超详细、附图、附代码)
  15. 针对elementUI 中InfiniteScroll按需引入的一点注意事项
  16. 上海市计算机应用大赛答辩,2017年(第九届)上海市大学生计算机应用能力大赛(决赛)在我校成功举办...
  17. torch.roll() 函数用法
  18. hydra.php,Hydra MES
  19. 大文件上传+解决方案
  20. C# Pdf添加页码(iTextSharp)

热门文章

  1. Jeesite 客户端验证Jquery Validate及服务器端验证
  2. 怎么在html页面和js里判断是否是IE浏览器
  3. Hive Performance 学习笔记
  4. 鼠标指向变成英文导航(CSS)_网页代码站(www.webdm.cn)
  5. ossim系统下nagios监控机器可用性用rrd图形显示
  6. 严格匹配_2020湖北省考招录“刚柔并济”强调“人岗匹配”
  7. mysql编译安装root密码_MySQL 5.7.11编译安装以及修改root密码小结
  8. 信息学奥赛一本通(2039:【例5.6】冒泡排序)
  9. 图论算法 —— 图论概述
  10. 潜伏者(洛谷-P1071)