python--struct, cPickle, pyamf效能對比

來源:互聯網
上載者:User

在大型網路應用中,序列化是必要的手段,所以一定要大致瞭解序列化上的效能消耗,才能寫出高效能的程式。常用的序列化就是使用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,這裡測試是只跑在一個核上)
下面是測試struct打包效能的代碼:打包的資料量為1116位元組(8+1108)

#! /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%。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.