关于python struct模块的性能问题-----待学习

struct模块之前看过一些,也看到过说是struct模块的性能不行,今天在网上看到了另外一篇文章,先转过来待后面使用时研究下:


================================华丽的转载分割线==========================================

转载来源: 文章来自http://www.cnblogs.com/coser/archive/2011/12/17/2291160.html这篇文章

================================再割====================================================

下面是部分文章原文:感觉其中ctypes.create_string_buffer这个蛮好的,没研究过,还是没学到家啊。。。。



3、利用buffer,使用pack_into和unpack_from方法

      使用二进制打包数据的场景大部分都是对性能要求比较高的使用环境。而在上面提到的pack方法都是对输入数据进行操作后重新创建了一个内存空间用于返回,也就是说我们每次pack都会在内存中分配出相应的内存资源,这有时是一种很大的性能浪费。struct模块还提供了pack_into() 和 unpack_from()的方法用来解决这样的问题,也就是对一个已经提前分配好的buffer进行字节的填充,而不会每次都产生一个新对象对字节进行存储。

import struct

import binascii

import ctypes

 

values = (1, 'abc', 2.7)

s = struct.Struct('I3sf')

prebuffer = ctypes.create_string_buffer(s.size)

print 'Before :',binascii.hexlify(prebuffer)

s.pack_into(prebuffer,0,*values)

print 'After pack:',binascii.hexlify(prebuffer)

unpacked = s.unpack_from(prebuffer,0)

print 'After unpack:',unpacked

输出:

Before : 000000000000000000000000
After pack: 0100000061626300cdcc2c40
After unpack: (1, 'abc', 2.700000047683716)
对比使用pack方法打包,pack_into 方法一直是在对prebuffer对象进行操作,没有产生多余的内存浪费。另外需要注意的一点是,pack_into和unpack_from方法均是对string buffer对象进行操作,并提供了offset参数,用户可以通过指定相应的offset,使相应的处理变得更加灵活。例如,我们可以把多个对象pack到一个buffer里面,然后通过指定不同的offset进行unpack:

import struct

import binascii

import ctypes

 

values1 = (1, 'abc', 2.7)

values2 = ('defg',101)

s1 = struct.Struct('I3sf')

s2 = struct.Struct('4sI')

 

prebuffer = ctypes.create_string_buffer(s1.size+s2.size)

print 'Before :',binascii.hexlify(prebuffer)

s1.pack_into(prebuffer,0,*values1)

s2.pack_into(prebuffer,s1.size,*values2)

print 'After pack:',binascii.hexlify(prebuffer)

print s1.unpack_from(prebuffer,0)

print s2.unpack_from(prebuffer,s1.size)

输出:

Before : 0000000000000000000000000000000000000000
After pack: 0100000061626300cdcc2c406465666765000000
(1, 'abc', 2.700000047683716)
('defg', 101)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值