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

Python类内存使用

冯浩旷
2023-03-14

我试图了解python类是如何实现的,以及分配给它们会消耗多少内存。所以我创建了一个大的numpy数组,然后将其分配给一个类,然后将该类分配给另一个类(如下所示)。

import numpy as np

class Foo(object):
    def __init__(self, x=0):
        self.x = x

class Bar(object):
    def __init__(self, x=None):
        self.x = x

x = np.random.normal(0, 1, (50000, 10))
a = Foo(x)
b = Bar(a)

使用sys。getsizeof似乎无助于获取numpy阵列的内存大小。Numpy数组使用nbytes,但是引用Numpy数组的类没有nbytes作为方法。

如果我更改了x,则a.xb.x.x会自动更新以反映它。Python文档说明对象别名类似于指针。我认为a.xb.x.x更像是指向原始x的指针,对吗?像指针一样,ab的内存占用应该与x的底层大小无关。这是正确的吗?

共有1个答案

郤旭东
2023-03-14

将这些对象指定给numpy将提供仅表示指针大小的对象引用,因此它们与对象的实际大小无关。

至于sys。getsizeof(),这将获得numpy对象描述的大小,但不是所有子对象的大小,因此在这种情况下它肯定不准确。我的猜测是,在这种情况下,实际大小将是sys。getsizeof(x)x.n字节

至于a存储x,是的,默认情况下Python只复制引用,而不复制实际值。

为了说明这种行为:

x = []
y = x
x.append('SPAM')
print y
# Returns: ['SPAM']

Pypler是一个分析内存使用情况的好模块

 类似资料:
  • 问题内容: Python程序是否有办法确定当前正在使用多少内存?我已经看到了有关单个对象的内存使用情况的讨论,但是我需要的是该过程的总内存使用情况,以便可以确定何时需要开始丢弃缓存的数据。 问题答案: 这是适用于各种操作系统(包括Linux,Windows 7等)的有用解决方案: 在我当前使用psutil 5.6.3安装的python 2.7中,最后一行应为 相反(API发生了变化)。 注意:如果

  • 我正在使用python来分析一些大文件,我遇到了内存问题,所以我一直在使用sys.getsizeof()来尝试跟踪使用情况,但是它在Numpy数组中的行为很奇怪。这里有一个例子,涉及到我必须打开的反照率地图: 数据仍然存在,但是对象的大小,一个3600x7200像素的映射,已经从200 Mb变为80字节。我希望我的内存问题结束,把所有的东西都转换成numpy数组,但我觉得这种行为,如果是真的,会在

  • 问题内容: 我写了一个程序,可以总结如下: 实际代码(尤其是)要复杂得多。仅使用将其当作参数的这些值(意味着它不引用) 基本上,它将巨大的数据集加载到内存中并进行处理。输出的写操作委托给一个子进程(它实际上写到多个文件中,这需要很多时间)。因此,每次处理一个数据项时,它都会通过res_queue发送到子流程,然后该子流程根据需要将结果写入文件中。 子流程不需要访问,读取或修改以任何方式加载的数据。

  • 问题内容: 我们有一个使用OpenSSL的Python绑定的Linux应用程序,我怀疑它会导致随机崩溃。有时,我们会看到它崩溃并显示以下消息: Python致命错误:GC对象已被跟踪 这似乎是库方面的编程错误,或者是内存损坏的症状。给定一个核心文件,有什么办法知道它执行的最后一行Python源代码?还是如果它附加在GDB中?我意识到这可能是所有已编译的字节码,但是我希望那里有人解决了这个问题。当前

  • 问题内容: 我想知道我的Python应用程序的内存使用情况,尤其想知道哪些代码块/部分或对象消耗了最多的内存。Google搜索显示商用的是(仅限)。 开源的是和。 我没有尝试过任何人,所以我想知道哪个是最好的考虑因素: 提供大多数细节。 我必须对我的代码做最少的修改或不做任何更改。 问题答案: 堆很容易使用。在代码中的某些时候,你必须编写以下代码: 这将为你提供如下输出: 你还可以从哪里找到对象的

  • 问题内容: 是否有一个Python库,可以在不使用实际磁盘文件的情况下操纵内存中的zip存档? ZipFile库不允许您更新存档。唯一的方法似乎是将其提取到目录中,进行更改,然后从该目录中创建新的zip。我想修改没有磁盘访问权限的zip归档文件,因为我将下载它们,进行更改并再次上传它们,因此没有理由存储它们。 尽管几乎没有任何接口可以避免磁盘访问,但类似于Java的ZipInputStream /