我在win 7上使用Python 3.4 32位。
我发现numpy数组中的整数有4个字节,但在列表中它有10个字节。
import numpy as np
s = 10;
lt = [None] * s;
cnt = 0 ;
for i in range(0, s):
lt[cnt] = i;
cnt += 1;
lt = [x for x in lt if x is not None];
a = np.array(lt);
print("len(a) is " + str(len(a)) + " size is " + str(sys.getsizeof(a)) \
+ " bytes " + " a.itemsize is " + str(a.itemsize) + " total size is " \
+ str(a.itemsize * len(a)) + " Bytes , len(lt) is " \
+ str(len(lt)) + " size is " + str(sys.getsizeof(lt)) + " Bytes ");
len(a) is 10 size is 40 bytes a.itemsize is 4 total size is 40 Bytes , len(lt) is 10 size is 100 Bytes the fist element has 12 Bytes
因为在列表中,每个元素都必须保留指向下一个元素的指针?
如果我为列表分配了一个字符串:
lt[cnt] = "A";
len(a) is 10 size is 40 bytes a.itemsize is 4 total size is 40 Bytes , len(lt) is 10 size is 100 Bytes the fist element has 30 Bytes
因此,在数组中,每个元素有4个字节,在列表中,它是30个字节。
但是,如果我尝试了:
lt[cnt] = "AB";
len(a) is 10 size is 40 bytes a.itemsize is 8 total size is 80 Bytes , len(lt) is 10 size is 100 Bytes the fist element has 33 Bytes
在数组中,每个元素有8个字节,但在列表中,它是33个字节。
如果我尝试:
lt[cnt] = "csedvserb revrvrrw gvrgrwgervwe grujy oliulfv qdqdqafwg5u u56i78k8 awdwfw"; # 73 characters long
len(a) is 10 size is 40 bytes a.itemsize is 292 total size is 2920 Bytes , len(lt) is 10 size is 100 Bytes the fist element has 246 Bytes
在数组中,每个元素有292个字节(= 73 * 4),但在列表中,它有246个字节?
任何解释将不胜感激。
答案 0 :(得分:0)
数组中的元素大小很简单 - 它由dtype
确定,并且您的代码显示可以在.itemsize
找到。 4字节很常见,例如np.int32
,np.float64
。 Unicode字符串也为每个字符分配4个字节 - 尽管真正的unicode使用可变数量的字符。
列表(和元组)的每个元素大小比较棘手。列表不直接包含元素,而是包含指向存储在别处的对象的指针。您的列表大小记录指针的数量,以及填充。垫可以有效地增大尺寸(.append
)。您的所有列表都具有相同的尺寸,无论第一项是什么'大小
我的数据:
In [2324]: lt=[None]*10
In [2325]: sys.getsizeof(lt)
Out[2325]: 72
In [2326]: lt=[i for i in range(10)]
In [2327]: sys.getsizeof(lt)
Out[2327]: 96
In [2328]: lt=['A' for i in range(10)]
In [2329]: sys.getsizeof(lt)
Out[2329]: 96
In [2330]: lt=['AB' for i in range(10)]
In [2331]: sys.getsizeof(lt)
Out[2331]: 96
In [2332]: lt=['ABCDEF' for i in range(10)]
In [2333]: sys.getsizeof(lt)
Out[2333]: 96
In [2334]: lt=[None for i in range(10)]
In [2335]: sys.getsizeof(lt)
Out[2335]: 96
和相应的数组:
In [2344]: lt=[None]*10; a=np.array(lt)
In [2345]: a
Out[2345]: array([None, None, None, None, None, None, None, None, None, None], dtype=object)
In [2346]: a.itemsize
Out[2346]: 4
In [2347]: lt=['AB' for i in range(10)]; a=np.array(lt)
In [2348]: a
Out[2348]:
array(['AB', 'AB', 'AB', 'AB', 'AB', 'AB', 'AB', 'AB', 'AB', 'AB'],
dtype='<U2')
In [2349]: a.itemsize
Out[2349]: 8
当列表包含None
时,数组是对象dtype,元素都是指针(4个字节的整数)。