array模块提供了一种数组概念上的紧凑类型的实现,数组中的元素必须为同一类型,且为基础数据类型(字符、整数或浮点数),这些元素在内存中是按固定大小(字节)连续存储的,相比于列表和元组类型,array模块的实现更加节省内存。但是注意,使用的时候还是需要根据实际情况来看,因为Python对于数字、字符串等基础数据类型也是做了优化的,不一定array模块就更节省内存。
>>> import sys
>>> import array
>>> num = 100000
>>> lst = list(i for i in range(num))
>>> sys.getsizeof(lst)
879840
>>> a = array.array(‘i‘, lst) # i表示数组中元素的类型,具体支持的类型见下面的表格
>>> a.itemsize # 每个元素占用的内存大小,这里为4byte
4
>>> sys.getsizeof(a) # 可以看到,总的大小为400064=4*num+64,比list类型少了一半多
400064
array支持的数据类型(Type code为array.array的第一个参数)
Type code | C Type | Python Type | Minimun size in bytes |
---|---|---|---|
‘b‘ | signed char | int | 1 |
‘B‘ | unsigned char | int | 1 |
‘u‘ | wchar_t | Unicode character | 2 |
‘h‘ | signed short | int | 2 |
‘H‘ | unsigned short | int | 2 |
‘i‘ | signed int | int | 2 |
‘I‘ | unsigned int | int | 2 |
‘l‘ | signed long | int | 4 |
‘L‘ | unsigned long | int | 4 |
‘q‘ | signed long long | int | 8 |
‘Q‘ | unsigned long long | int | 8 |
‘f‘ | float | float | 4 |
‘d‘ | double | float | 8 |
注:array(‘u‘)可能是16位或者32位,这取决于运行的系统。并且在Python3.9之后将弃用之前的Py_UNICODE,而使用现在的wchar_t,但是不影响以前Py_UNICODE的使用,因为Py_UNICODE只是wchar_t的别名。但是会在Python4.0中弃用Py_UNICODE。
array.array(typecode[, initializer]):使用typecode参数创建一个array对象,也可以使用initializer参数初始化一个array对象,initializer必须是一个列表、bytes-like对象或者一个可迭代的对象,不过需要注意这些对象中的元素需要和上面表格中的Python Type匹配。array对象也支持索引、切片、拼接等操作,不过前提是操作的对象的typecode都是同一种类型。
常用的方法和属性:
(address, length)
,address是array对象的内存地址,length是array对象中元素的个数。可以使用array.buffer_info()[1] * array.itemsize
计算出array对象的字节数。‘u‘
类型,如果s是其他类型,可以使用array.frombytes(unicodestring.encode(enc))
。‘u‘
类型,如果是其他类型,可以使用array.tobytes().decode(enc)
来获取一个Unicode字符串。原文:https://www.cnblogs.com/guyuyun/p/14617659.html