python jsonpath效率低_Python学习:jsonpath的性能问题
问题
前面刚总结了,利用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的性能问题相关推荐
- python多线程效率低_Python 多进程、多线程效率比较
Python 界有条不成文的准则: 计算密集型任务适合多进程,IO 密集型任务适合多线程.本篇来作个比较. 通常来说多线程相对于多进程有优势,因为创建一个进程开销比较大,然而因为在 python 中有 ...
- python从入门到_Python学习路线从入门到上手,如何快速Python学习?
因为清晰易读的风格,广泛的适用性,Python已经成为最受欢迎的编程语言之一.在TIOBE 排行榜中位居第四,是名副其实的人工智能第一语言. 风靡的另一个原因是,Python有非常多的第三方库.比如用 ...
- python开发效率怎样_Python 的开发效率真的比 Java高吗?
真的比Java高很高. 几个例子. 爬虫领域,几年前就用Scrapy抓百度,新浪,股吧等各种东西. 五分钟写好一个小爬虫,爽到暴有没有?当年我就是靠教人写爬虫...才骗到小妹妹跟我约会的. 文本处理, ...
- python时间复杂度怎么算_python学习:算法和时间复杂度
python学习:算法和时间复杂度 算法 什么是算法? 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制. 算法也可以 ...
- 我学python前一句_Python学习教程:人生苦短,我用Python?入门前你要知道这些
有多少伙伴是因为一句'人生苦短,我用Python'就要去学Python的?之前也大家更新过Python学习教程普及过多次的Python相关知识,不过大家还是还得计划一下Python学习路线!Pytho ...
- python用法查询笔记_Python学习笔记 - 2 - PyCharm的基本使用
什么是IDE 开始学习的小白同学,一看到这三个字母应该是懵逼的,那么我们一点一点来说. 既然学习Python语言我们就需要写代码,那么代码写在哪里呢?在记事本里写 在word文档里写 在sublime ...
- 自学python 编程基础知识_python学习-基础知识-1
1.计算机历史 计算机使用高低电压的两种状态来描述信息.计算机可以理解的只有二进制数据即010100011....,1个比特位可以表示的状态只有2种,n个比特位可以表示的状态有2的n次方种. 所以如果 ...
- 流浪的python博客园_python学习心得第一章
初始python 1什么是程序 计算机程序是一组执行某种动作的的指令.和那些电路.芯片.显卡.硬盘等不同,它不是计算机本身可以触摸的部分,而是隐藏在背后运行在硬件上面的东西.程序就是一系列告诉没有知觉 ...
- [转载] python numpy 子数组_Python学习笔记3:Numpy入门
参考链接: Python中的numpy.logaddexp2 参考<Python:数据科学手册>一书,仅作个人学习及记录使用,若有侵权,请联系后台删除. 1 理解Python中的数据类型 ...
最新文章
- [洛谷3811]【模板】乘法逆元
- 1、MySQL数据类型简介
- movzbl和movsbl
- 教你学会Linux/Unix下的vi文本编辑器
- [转]Eclipse Java注释模板设置详解
- textaligncenter仍然不居中_三星Galaxy S21/S21+保护膜曝光:居中挖孔 回归直屏_手机行情...
- java 重载 大于_详解java重载与覆写的区别
- Remote Desktop Connection Manager2.7 安装+基本使用
- python如何下载pdfminer_在python中使用PDFMiner从PDF文件中提取文本?
- spark graphx的Triangle三角形计数算法使用示例
- DNS劫持怎么办、如何修复DNS劫持?DNS劫持怎么修复
- 桂电计算机专业2021推免人数,2021届计算机科学与技术学院推免公示
- OpenCV简单实现PhotoShop图层混合
- (Docker实战)在CentOS7上使用Docker;(超详细、附图、附代码)
- 针对elementUI 中InfiniteScroll按需引入的一点注意事项
- 上海市计算机应用大赛答辩,2017年(第九届)上海市大学生计算机应用能力大赛(决赛)在我校成功举办...
- torch.roll() 函数用法
- hydra.php,Hydra MES
- 大文件上传+解决方案
- C# Pdf添加页码(iTextSharp)
热门文章
- Jeesite 客户端验证Jquery Validate及服务器端验证
- 怎么在html页面和js里判断是否是IE浏览器
- Hive Performance 学习笔记
- 鼠标指向变成英文导航(CSS)_网页代码站(www.webdm.cn)
- ossim系统下nagios监控机器可用性用rrd图形显示
- 严格匹配_2020湖北省考招录“刚柔并济”强调“人岗匹配”
- mysql编译安装root密码_MySQL 5.7.11编译安装以及修改root密码小结
- 信息学奥赛一本通(2039:【例5.6】冒泡排序)
- 图论算法 —— 图论概述
- 潜伏者(洛谷-P1071)