python--struct, cPickle, pyamf性能对比

在大型网络应用中,序列化是必要的手段,所以一定要大致了解序列化上的性能消耗,才能写出高性能的程序。常用的序列化就是使用pickle,冷门的是使用pyamf。AMF数据在网络通信时候,既可以起到部分的自定义协议作用,又可以对二进制数据进行一个很好的压缩。下面我们就来测试一下这两种序列化的开销。

序列化:pickle

打包:struct


首先,要先来份参考数据。空跑一下while循环:

import time

start_time = time.time()
print start_time

j = 1
while True:
    j += 1
    end_time = time.time()
    if end_time - start_time >= 1 :
        break
print j
print end_time

在苹果机器上,I5处理器,主频2.3GHz ,跑出来的数据结果如下:

>>>
1343818757.17
2174001
1343818758.17
>>>
也就是说,粗略的算,每秒可以跑210万次的+1操作,和time函数调用。(GIL,这里测试是只跑在一个核上)

下面是测试struct打包性能的代码:打包的数据量为1116字节(8+1108)
#! /usr/bin/env python
#coding=utf-8


import time
import struct

test_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)  # 1108
print "-----",str_data_length


start_time = time.time()
print "start_time:", start_time

j = 1
while True:
    j += 1
    xulie_data = struct.pack(">ii1108s", 888, 333, str_data)
    
    end_time = time.time()
    if end_time - start_time >= 1 :
        break
print "loop_num:", j
print "end_time:  ",end_time
print 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性能对比)