2024-06-01 04:15:58 发布
网友
array.array('B')和bytearray有什么区别?
array.array('B')
bytearray
from array import array a = array('B', 'abc') b = bytearray('abc') a[0] = 100 b[0] = 'd' print a print b
有记忆或速度差异吗?每个用例的首选用例是什么?
bytearray有所有常用的str方法。您可以将其视为可变的str(Python3中的字节)
str
而array.array适合读写文件B'只是array的特例
你可以看到,看每个
>>> dir(bytearray) ['__add__', '__alloc__', '__class__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'capitalize', 'center', 'count', 'decode', 'endswith', 'expandtabs', 'extend', 'find', 'fromhex', 'index', 'insert', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'pop', 'remove', 'replace', 'reverse', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] >>> dir(array) ['__add__', '__class__', '__contains__', '__copy__', '__deepcopy__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'buffer_info', 'byteswap', 'count', 'extend', 'frombytes', 'fromfile', 'fromlist', 'fromstring', 'fromunicode', 'index', 'insert', 'itemsize', 'pop', 'remove', 'reverse', 'tobytes', 'tofile', 'tolist', 'tostring', 'tounicode', 'typecode']
bytearray是Python 2.x的string类型的继承者。它基本上是内置字节数组类型。与原始的string类型不同,它是可变的。
string
另一方面,创建array模块是为了创建与外部世界通信的二进制数据结构(例如,读取/写入二进制文件格式)。
array
与bytearray不同,它支持各种数组元素。它很灵活。
因此,如果您只需要一个字节数组,bytearray应该可以正常工作。如果您需要灵活的格式(比如当数组的元素类型需要在运行时确定时),array.array是您的朋友。
array.array
不看代码,我的猜测是bytearray可能更快,因为它不需要考虑不同的元素类型。但有可能array('B')返回一个bytearray。
array('B')
Python Patterns - An Optimization Anecdote是一个很好的读物,它指出array.array('B')速度很快。使用那篇文章中的timing()函数确实表明array.array('B')比bytearray()快:
timing()
bytearray()
#!/usr/bin/env python from array import array from struct import pack from timeit import timeit from time import clock def timing(f, n, a): start = clock() for i in range(n): f(a); f(a); f(a); f(a); f(a); f(a); f(a); f(a); f(a); f(a) finish = clock() return '%s\t%f' % (f.__name__, finish - start) def time_array(addr): return array('B', addr) def time_bytearray(addr): return bytearray(addr) def array_tostring(addr): return array('B', addr).tostring() def str_bytearray(addr): return str(bytearray(addr)) def struct_pack(addr): return pack('4B', *addr) if __name__ == '__main__': count = 10000 addr = '192.168.4.2' addr = tuple([int(i) for i in addr.split('.')]) print('\t\ttiming\t\tfunc\t\tno func') print('%s\t%s\t%s' % (timing(time_array, count, addr), timeit('time_array((192,168,4,2))', number=count, setup='from __main__ import time_array'), timeit("array('B', (192,168,4,2))", number=count, setup='from array import array'))) print('%s\t%s\t%s' % (timing(time_bytearray, count, addr), timeit('time_bytearray((192,168,4,2))', number=count, setup='from __main__ import time_bytearray'), timeit('bytearray((192,168,4,2))', number=count))) print('%s\t%s\t%s' % (timing(array_tostring, count, addr), timeit('array_tostring((192,168,4,2))', number=count, setup='from __main__ import array_tostring'), timeit("array('B', (192,168,4,2)).tostring()", number=count, setup='from array import array'))) print('%s\t%s\t%s' % (timing(str_bytearray, count, addr), timeit('str_bytearray((192,168,4,2))', number=count, setup='from __main__ import str_bytearray'), timeit('str(bytearray((192,168,4,2)))', number=count))) print('%s\t%s\t%s' % (timing(struct_pack, count, addr), timeit('struct_pack((192,168,4,2))', number=count, setup='from __main__ import struct_pack'), timeit("pack('4B', *(192,168,4,2))", number=count, setup='from struct import pack')))
timeit度量实际上表明array.array('B')有时是bytearray()速度的两倍以上
我特别感兴趣的是将IP地址打包成4字节字符串进行排序的最快方法。看起来str(bytearray(addr))和array('B', addr).tostring()都没有接近pack('4B', *addr)的速度。
str(bytearray(addr))
array('B', addr).tostring()
pack('4B', *addr)
bytearray
有所有常用的str
方法。您可以将其视为可变的str
(Python3中的字节)而array.array适合读写文件B'只是array的特例
你可以看到,看每个
bytearray
是Python 2.x的string
类型的继承者。它基本上是内置字节数组类型。与原始的string
类型不同,它是可变的。另一方面,创建
array
模块是为了创建与外部世界通信的二进制数据结构(例如,读取/写入二进制文件格式)。与
bytearray
不同,它支持各种数组元素。它很灵活。因此,如果您只需要一个字节数组,
bytearray
应该可以正常工作。如果您需要灵活的格式(比如当数组的元素类型需要在运行时确定时),array.array
是您的朋友。不看代码,我的猜测是
bytearray
可能更快,因为它不需要考虑不同的元素类型。但有可能array('B')
返回一个bytearray
。Python Patterns - An Optimization Anecdote是一个很好的读物,它指出
array.array('B')
速度很快。使用那篇文章中的timing()
函数确实表明array.array('B')
比bytearray()
快:timeit度量实际上表明
array.array('B')
有时是bytearray()
速度的两倍以上我特别感兴趣的是将IP地址打包成4字节字符串进行排序的最快方法。看起来
str(bytearray(addr))
和array('B', addr).tostring()
都没有接近pack('4B', *addr)
的速度。相关问题 更多 >
编程相关推荐