背景介绍

  因为python中有eval()方法,可以很方便的将一些字符串类型与字典等数据结构之间进行转换, 所以公司的数据处理同事在保存一些特殊数据时就直接将字典的字符串保存在数据库中。

在程序中读取该字段,再使用eval()将其转成字典进行处理。 由于这样比较方便,节省了解析的成本,所以广泛被公司内部采用。

  后来,随着公司业务发展,这类型的字段长度也随之变长,由原先的几十上百字节到现在的百万字节(跨度很大,既定事实),发现处理程序的处理速度也降了下来,经过一系列的性能

定位发现,eval方法在转换大长度的字符串时耗时严重。

分析算法

  使用相同的数据结构,对比eval与json转字符串转字典方面的性能。

代码

 #coding:utf8

 import sys,json
from time import time a = {} for i in range(int(sys.argv[1])):
a[i+1914246144] = (24, 31620, 3.874021, 870569, 700552) #转成字符串
dict_str = repr(a) t1 = time() d = eval(dict_str) t2 = time()
print "eval cost time is %f." % (t2 -t1) #转成json类型的字符串
dict_json = json.dumps(a) t1 = time() d = json.loads(dict_json) t2 = time() print "json cost time is %f." % (t2 -t1)

测试结果:

注:第一列代表字典的items数量,后面的单位为秒。

基本上可以得出结论,在长字符串转换字典方面,eval比json的方法,慢7~9倍左右。

另外,根据笔者查询资料,eval一般是执行字符串类型的python语句使用,而且也会有一些风险,应该尽量避免滥用,有跟我类似苦恼的朋友,希望看完本篇介绍能有点小小的收获吧。

一般外部数据输入的格式,尽量使用通用的数据格式,如 xml、json等,方便语言扩展,妙处多多。

Python关于eval与json在字典转换方面的性能比较的更多相关文章

  1. python将字符串转换成对应的python数据类型--eval和json.loads(),json.dumps()

    eval()和json.loads() 都可以将字符串转换成对应的python数据类型,举个字典的例子,同样适合其他数据类型元组.列表.集合. In [3]: ss = '{"a" ...

  2. python学习笔记:json与字典的转换(dump 和dumps load和loads的区别)

    1. json序列化(字典转成字符串)方法: dumps:无文件操作            dump:序列化+写入文件 2. json反序列化(字符串转成字典)方法: loads:无文件操作     ...

  3. python的eval和json.loads(),json.dumps()

    eval() 将字符串当成一个表达式去执行,可以想象成一个去字符串然后执行的操作. In [1]: s = '3*8' In [2]: eval(s) Out[2]: 24 eval()和json.l ...

  4. python中eval()和json.dumps的使用

    在python中通过requests.get(url)获取json数据,此时可能需要eval进行解析. # -*- coding: utf-8 -*- import requests r = requ ...

  5. Python3入门系列之-----json与字典转换

    json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写 JSON 函数 使用 JSON 函数需要导入 json 库:import js ...

  6. python中eval()和json.loads的区别

    一.最近在写接口测试脚本时,发现当读取Excel用例时,有时候要用eval,有时候又要用json.loads,不知道区别,只能换一下就可以用了,不知道其中的原理,特地百度了下.于是就记录了下,以便后续 ...

  7. Python 序列化模块(json,pickle,shelve)

    json模块 JSON (JavaScript Object Notation):是一个轻量级的数据交换格式模块,受javascript对象文本语法启发,但不属于JavaScript的子集. 常用方法 ...

  8. Python:序列化 pickle JSON

    序列化 在程序运行的过程中,所有的变量都储存在内存中,例如定义一个dict d=dict(name='Bob',age=20,score=88) 可以随时修改变量,比如把name修改为'Bill',但 ...

  9. Python中字符串/字典/json之间的转换

    import json #定义一个字典d1,字典是无序的 d1 = { "a": None, "b": False, "c": True, ...

随机推荐

  1. Block 代替for循环

    NSDictionary *aDictionary = [[NSDictionary alloc]initWithObjectsAndKeys:", nil]; [aDictionary e ...

  2. New Year Transportation(水)

    New Year Transportation Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  3. 奇妙的go语言(聊天室的开发)

    [ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 这是一篇关于聊天室开发的博客,原来文章的地址来自于此.这篇文章非常具有代表性,对于代码中的函数 ...

  4. html5lib-python doc

    http://html5lib.readthedocs.org/en/latest/ By default, the document will be an xml.etree element ins ...

  5. 一道movfuscator混淆过的简单逆向

        月赛中出了道经过movfuscator混淆的逆向题目,记录一下过程.跑起来发现需要用户输入长度为20的字符串,我尝试着输入了几次都是直接退出了,没有任何提示.用IDA打开,题目里面几乎全是mo ...

  6. 《JavaScript 闯关记》之作用域和闭包

    作用域和闭包是 JavaScript 最重要的概念之一,想要进一步学习 JavaScript,就必须理解 JavaScript 作用域和闭包的工作原理. 作用域 任何程序设计语言都有作用域的概念,简单 ...

  7. M - Candy Sharing Game

    Description A number of students sit in a circle facing their teacher in the center. Each student in ...

  8. UVA11806Cheerleaders(容斥)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 题目意思:在m行n列的矩形网格中放k个相同的石子,问有多少中方法?每个格子最多放一 ...

  9. (原)Ubuntu16中编译caffe

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5797526.html 参考网址: http://caffe.berkeleyvision.org/in ...

  10. python多线程抓取网页信息

    #!/usr/env  python #-*- coding: utf-8  -*- import urllib  import urllib2  import random  import requ ...