python中关于bytearray的使用

解释性语言像python php java之类,因为内存被解释器所管理,所以变得安全且易于编写代码,不过也性能低下,当然这是相对于可以直接操作内存的C、C++而言的。像字符串操作,如果能直接操作内存,那性能能提高很多。举个例子:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect_ex(('www.baidu.com', 80))
s.send("GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n")
s.setblocking(False)
res = ''
try:
    while True:
        res += s.recv(4096)
except:
    pass

socket的recv()函数每次都得创建一个新的字符串对象,这在解释性语言中很常见,特别是字符串的拼接之类,为了安全不允许对字符串进行修改,哪怕是大小写转换,也得开辟新的内存,创建新的对象。避免这些问题的办法是使用bytearray和StringIO。

resf = StringIO()
buf = bytearray(RECV_BUF_SIZE)
while wait_len > 0:
    tmp = self.sock.recv_into(buf, min(RECV_BUF_SIZE, wait_len))
    resf.write(buf[:tmp])
    wait_len -= tmp
res = resf.getvalue()

上面的例子假设我们知道需要接收的数据长度是wait_len。socket的recv_into就是提供了对bytearray的配合,这样就不是反复创建新字符串,而是对一个对象进行反复利用。

bytearray也支持普通字符串str的各种操作,比如join rfind startswith什么的,但是它是一个定长可修改的对象,创建的时候需要指定长度。

a = 'abc'
a[1] = 'm'  #invalid
b = bytearray(100)
b[1] = 'm' #ok

 

发表于 2015年08月20日 18:39   评论:0   阅读:3101  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo