当前位置: 首页 > 知识库问答 >
问题:

Numpy ndarray对象比列表大得多

李森
2023-03-14

我现在更详细地讨论了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

共有1个答案

应和光
2023-03-14
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,因为

  • 我有以下列表,里面是另一个列表,然后是字符串列表 <代码>列表 示例 除了执行嵌套循环并最终替换列表之外,还有更好的方法吗?也许有溪流?