python--struct, cPickle, pyamf性能对比
来源:互联网 发布:mdraw软件 编辑:程序博客网 时间:2024/06/05 04:10
在大型网络应用中,序列化是必要的手段,所以一定要大致了解序列化上的性能消耗,才能写出高性能的程序。常用的序列化就是使用pickle,冷门的是使用pyamf。AMF数据在网络通信时候,既可以起到部分的自定义协议作用,又可以对二进制数据进行一个很好的压缩。下面我们就来测试一下这两种序列化的开销。
序列化:pickle
打包:struct
首先,要先来份参考数据。空跑一下while循环:
import timestart_time = time.time()print start_timej = 1while True: j += 1 end_time = time.time() if end_time - start_time >= 1 : breakprint jprint end_time
在苹果机器上,I5处理器,主频2.3GHz ,跑出来的数据结果如下:
>>>
1343818757.17
2174001
1343818758.17
>>>
也就是说,粗略的算,每秒可以跑210万次的+1操作,和time函数调用。(GIL,这里测试是只跑在一个核上)
#! /usr/bin/env python#coding=utf-8import timeimport structtest_data = { 'baihe': { 'name': unicode('百合', 'utf-8'), 'say': unicode('清新,淡雅,花香', 'utf-8'), 'grow_time': 0.5, 'fruit_time': 0.5, 'super_time': 0.5, 'total_time': 1, 'buy':{'gold':2, } , 'harvest_fruit': 1, 'harvest_super': 1, 'sale': 1, 'level_need': 0, 'experience' : 2, 'exp_fruit': 1, 'exp_super': 1, 'used': True, }, '1':{ 'interval' : 0.3, 'probability' : { '98': {'chips' : (5, 25), }, '2' : {'gem' : (1,1), }, }, }, '2':{ 'unlock' : {'chips':1000, 'FC':10,}, 'interval' : 12, 'probability' : { '70': {'chips' : (120, 250), }, '20': {'gem' : (1,1), }, '10': {'gem' : (2,2), }, }, }, 'one':{ '10,5' :{'id':'m01', 'Y':1, 'msg':u'在罐子里发现了一个银币!',}, '3,7' :{'id':'m02', 'Y':10,'msg':u'发现了十个银币!好大一笔钱!',}, '15,5' :{'id':'m03', 'Y':2, 'msg':u'一只老鼠跑了过去',}, '7,4' :{'id':'m04', 'Y':4, 'msg':u'发现了四个生锈的银币……',}, '2,12' :{'id':'m05', 'Y':6, 'msg':u'六个闪亮的银币!',}, }, }str_data = str(test_data)str_data_length = len(str_data) # 1108print "-----",str_data_lengthstart_time = time.time()print "start_time:", start_timej = 1while True: j += 1 xulie_data = struct.pack(">ii1108s", 888, 333, str_data) end_time = time.time() if end_time - start_time >= 1 : breakprint "loop_num:", jprint "end_time: ",end_timeprint len(xulie_data)ii_tuple = struct.unpack(">ii1108s", xulie_data)print ii_tuple
cPickle测试:
测试原始数据大小,约为1k。
测试结果:
start_time: 1343873648.89
loop_num: 34514
end_time: 1343873649.89
868
粗略的算,每秒可以跑3.5万次的pickle.dumps()操作,和time函数调用。
代码参照后一篇博文。
pyamf测试:
测试原始数据大小,约为1k。
测试结果:
start_time: 1343897700.92
loop_num: 6805
end_time: 1343897701.92
656
粗略的算,每秒才可以跑6千次的AMF3编码操作,和time函数调用。
代码参照后一篇博文。
struct测试:
测试struct.pack(">ih", 55, 66)
测试结果:
start_time: 1343964526.48
loop_num: 730989
end_time: 1343964527.48
粗略的算,每秒可以跑70多万次的简单pack操作,和time函数调用。
总结:
可以看出,pyamf编码的效率并不高,单纯从序列化角度讲,cPickle的dumps()在协议1时,效率是pyamf的5倍多,但是pyamf的压缩比要比pickle.dumps()高出20%以上。
再说打包struct,简单测试来说,本身是很高效的,性能瓶颈不大。并且,解包的时候,效率还要比打包的时候,高出15-20%。
- python--struct, cPickle, pyamf性能对比
- msgpack[C++]使用笔记 和 msgpack/cPickle性能对比
- msgpack[C++]使用笔记 和 msgpack/cPickle性能对比
- msgpack[C++]使用笔记 和 msgpack/cPickle性能对比
- AMF--pyamf 协议性能测试
- python 下载安装PYAMF 框架
- Flex + Python + PyAMF编程实例
- Python cPickle模块
- python: pickle cpickle
- Python cPickle模块用法
- python cPickle的使用
- Python——cPickle
- Python cPickle模块
- Python cPickle模块
- Python cPickle模块用法
- python pickle, cPickle 模块
- python的存储器cPickle
- python pickle/cPickle模块
- 如何让物理世界的物体不受重力影响
- C语言内存讲解重点与习题
- C/C++中的memset
- Hibernate4实战 之 第四部分:关系映射
- STL中改变map的默认比较方式
- python--struct, cPickle, pyamf性能对比
- Hibernate4实战 之第五部分:Hibernate的事务和并发
- java阶段性学习基础总结
- 基于广义表的算术表达式的实现
- Hibernate4实战 之第六部分:基本实现原理
- Hibernate4实战 之第七部分:最佳实践
- ubunt下载速度行但是开网页卡---DNS配置
- 经典文章
- 黑马程序员-包、jar压缩包、异常(Exception)【重点】