我现在更详细地讨论了numpy数组。你总是读到numpyndarray
使用更少的内存,但是如果你看一下总内存消耗,就会发现ndarray
比列表中的要大得多。
在列表中,我们有28字节大小的int对象,但在numpy数组中,我们有numpy。int64大小为32字节的对象。
所以我不明白为什么他们说numpy对象使用更少的内存,因为numpy。int64对象比int对象大四个字节。
import numpy as np
from sys import getsizeof
def is_iterable(p_object):
try:
iter(p_object)
except TypeError:
return False
return True
def get_total_size(element, size):
if not is_iterable(element):
return size + getsizeof(element)
size = size + getsizeof(element)
for new_element in element:
size = get_total_size(new_element, size)
return size
if __name__ == "__main__":
x_list = list(range(100))
x_array = np.array(x_list)
print("x_list:")
print("A list with object references consumes in memory " + str(getsizeof(x_list)) + " Byte(s)")
print("A list of object references and all objects consumed in memory " + str(get_total_size(x_list, 0)) + " Byte(s)")
print("")
print("Numpy-Array:")
print("A ndarray object references consumes in memory " + str(getsizeof(x_array)) + " Byte(s)")
print("A ndarray of object references and all objects consumed in memory " + str(get_total_size(x_array, 0)) + " Byte(s)")
print("")
print("objecttype", type(x_array[1]), "size in bytes", getsizeof(x_array[1]), )
print("objecttype", type(x_list[1]), "size in bytes", getsizeof(x_list[1]), )
输出:
x_list:
A list with object references consumes in memory 1016 Byte(s)
A list of object references and all objects consumed in memory 3812 Byte(s)
Numpy-Array:
A ndarray object references consumes in memory 896 Byte(s)
A ndarray of object references and all objects consumed in memory 4096 Byte(s)
objecttype <class 'numpy.int64'> size in bytes 32
objecttype <class 'int'> size in bytes 28
In [144]: alist = list(range(100))
In [145]: getsizeof(alist)
Out[145]: 856
大多数getsizeof
问题只使用这个基数,而忽略了引用。
In [146]: get_total_size(alist,0)
Out[146]: 3652
单个整数的大小可能不同:
In [148]: getsizeof(50)
Out[148]: 28
In [149]: getsizeof(220000000000000000)
Out[149]: 32
100*28856=3656
足够近。小于256的整数是预先分配的,因此您的列表不会将这些整数添加到总内存使用量中。但这只是一个小细节。
对于数组,使用数字dtype,我们不需要检查不存在的“引用”
In [152]: arr = np.array(alist)
In [153]: getsizeof(arr)
Out[153]: 904
In [154]: arr.nbytes
Out[154]: 800
它的数据缓冲区中有800字节,大约100字节用于“开销”。这是100*8
,每个int64
数字有8个字节。其他数据类型可能具有不同的元素大小。
对于对象数据类型数组,添加引用很重要:
In [155]: arr = np.array(alist,object)
In [156]: getsizeof(arr)
Out[156]: 904
In [158]: get_total_size(arr,0)
Out[158]: 3700 # 2800+900
这个数组引用了与ist
相同的int。
您在数字数据类型数组上的get_total_size
发现
In [164]: getsizeof(np.int64(50))
Out[164]: 32
但是数组不会“存储”其中的100个。这32
是其值的8个字节和24的开销。这是“未装箱”对象,而不是存储值。
第一次来这里,所以我希望这是有意义的! 我有两个对象数组,比如l1和l2,我想在这两个列表之间进行比较,并在l3中得到一个不匹配的值。用户类包含2个字符串: 比如,l1包含:Java、JSF、JAXR、foo l2包含:JSF、JAXR 我可以对匹配的值进行比较,但不能对不匹配的值进行比较。这种逻辑似乎有缺陷。有什么帮助吗? 对于匹配值: 但是,对于不匹配,当我说不等于时,我得到的不是唯一的值,而
问题内容: 在我的数据框中,一列由列表组成,例如: 我需要找出此数据框中列表[1,2]的位置。我试过了: 和 但完全失败了。比较似乎很简单,但这是行不通的。我在这里想念什么吗? 问题答案: 不要在单元格中使用,这会给您带来很多问题。如果确实需要一列,请使用:
问题内容: 我有两个列表 , 都包含 MyData 类型的对象,而 MyData* 包含这些变量。 利斯塔和数组listB都包含MyData的对象,现在我要两个列表的对象值比较这里 的名字 ,以及 检查 变量一样,如果 利斯塔 包含这些对象值 和ListB也包含 然后我必须比较列表并返回false,因为两个列表相同但是如果ListA包含 和 ListB 包含 然后我必须比较列表并返回true,因为
我有两个列表*
我有以下列表,里面是另一个列表,然后是字符串列表 <代码>列表 示例 除了执行嵌套循环并最终替换列表之外,还有更好的方法吗?也许有溪流?