Python 在大数据处理下的优化(一)用json.loads比eval快10倍!!

eval 跟json.loads 是不一样的函数,是有实现不一样功能的地方,但是在某些地方它们两个函数的功能是一样的,在这个时候如果对执行效率有一定要求的话,建议不要用eval,改用json.loads会有惊喜哦。

一、eval

eval() 函数用来执行一个字符串表达式,并返回表达式的值。

二、json.loads

json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。

三、效率对比

eval 跟 json.loads 有时候都会用在对储存成列表字符串或者字典字符串的数据转换为python对象,使其成为python的list,dict格式的数据,方便进行计算。
本次试验只针对上面这种情况下做的对比

def test_time_list(func):
    from time import time
    start = time()
    a = str(list(range(10000)))
    for i in range(100):
        func(a)
    print('{} Time: {:5.2f}s'.format(str(func),time() - start))


def test_time_dict(func):
    from time import time
    a_dict = {
     }
    for i in range(10000):
        a_dict[i]=i
    start = time()
    a = str(json.dumps(a_dict))
    for i in range(100):
        func(a)
    print('{} Time: {:5.2f}s'.format(str(func),time() - start))

if __name__ == '__main__':
    import json,msgpack
    test_time_list(eval)
    test_time_list(json.loads)
    test_time_dict(eval)
    test_time_dict(json.loads)

输出结果为:
Python 在大数据处理下的优化(一)用json.loads比eval快10倍!!_第1张图片
可以看到,用json.loads的结果都比eval要快了10倍以上,列表的转换速度更快。
但是使用json.loads有个地方需要注意一下,json.loads对列表没什么要求,但是对字典的格式有一定的要求,key值要保持是双引号的key,单引号的key或者int类型都会报错。
报错内容如下
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

因此字典的话建议储存格式就是要用json.dumps转换成标准的json格式然后再储存成字符串。

另外如果是其他序列化格式的,对json的速度不满意的可以考虑用一下msgpack,使用方式也很简单,但是也是对格式有一定的要求,有很多博主进行过测试,都是比json快几倍以上。这里就不详讲了。

我是一只前进的蚂蚁,希望能一起前行。

如果对您有一点帮助,一个赞就够了,感谢!

注:如果本篇博客有任何错误和建议,欢迎各位指出,不胜感激!!!

你可能感兴趣的:(优化,python,字符串,列表,json)