简介:本文的首席执行官注释将介绍有关python对象占用多少资源的相关内容。我希望这对每个人都会有所帮助。让我们来看看。
因为Python中的所有事物都是对象,所以Python的存储问题是对象的存储问题。实际上,对于每个对象,Python将分配一个存储空间来存储它。
那么,如何在内存中分布Python,如何管理内存以及如何发布内存?
总而言之,有几个方面:参考计数,垃圾回收,内存池机构
Python使用参考计数将对象维护在跟踪内存中。Python记录了有多少个参考文献,也就是说,参考计数
1.创建对象a ='abc'
2.引用对象b = a
3.对象由其他对象引用li = [1,2,a]
4.对象将函数作为参数传递给函数:foo(x)
1.删除del a或del b
2.变量引用其他对象B = C或A = C
3.该变量留下了位置的范围(函数调用端)。例如,在上面的foo(x)函数的末尾,x方向的对象引用减少1。
4.在其他参考对象中删除(删除)li.remove(a)
5.窗口对象本身被破坏:del li,或窗口对象本身离开范围。
也就是说,对象p参考d中的属性和对象d中的属性同时引用,这仅导致p和d对象,并且由于仍然引用了它们的内存空间,因此无法释放其内存空间。深度解释是在周期参考后,P和D的数量被引用为2,并且在删除了P和D对象后,对1的参考数称为1,而不是0,并且只能检查Python一个对象被引用一个对象的引用。当数字为0时,它将自动释放其内存,因此P和D的内存空间在此处无法发布。
垃圾回收机制:①参考数数,②删除标记,③划分与回收利用
引用计数也是一种垃圾收集机制,它也是最直观,最简单的垃圾收集技术。当python的某个对象的参考计数降低到0时,这意味着没有引用对象,对象变为对象必须成为一个必须成为的需要。回收垃圾。(如果发生周期参考,参考计数机制将不再起作用)
优点:简单而真实的时间,缺点:维持参考计数消费资源,无法解决周期参考。
如果两个对象的参考计数为1,但仅存在它们之间的循环参考,则两个对象都需要回收。也就是说,参考计数为0,因此首先删除周期参考,并将绘制这两个对象的有效计数。
标记算法有明显的缺点:在删除非活动性的对象之前,它必须按顺序扫描整个内存堆栈,即使只有一小部分活动对象必须扫描所有对象。
为了提高效率,他仍然存在许多物体。可以认为此类对象不需要经常回收。它可以分为不同的集合。每个恢复集合之间的间隔是不同的。简而言之,这是Python的产生。
具体而言,Python中的垃圾分为1,2,3代。第一代中的对象将在每次回收时清洁。清洁后有一个参考对象时,他仍然会进入第二代集合,与相同的相同,与相同的相同,与相同的相同,与相同的相同,相同,相同,相同,与相同的相同,与相同的相同。当清理第二代集合时,存在的对象将进入第三代集合。
如何分配每个集合的清洁时间:首先清理第一代垃圾。清洁10个代垃圾后,将清理2代垃圾。清洁2个代垃圾后,将清理3代。
在Python中,多次应用的记忆是一小部分记忆。在这些小块中申请后,它将很快发布。当大量消耗少量内存的物体时,经常调用新/malloc会导致较大的数字片段降低效率。
内存池的概念是预先在内存中以一定的内存应用。相等大小的内存块作为备用。当有新的内存需求时,首先将内存从内存池分配到此需求。在不够的情况下,申请新的。MEMORY。这样做的最重要的优势是它可以降低内存片段并提高效率。
Python分为大记忆和小内存:(256K是记忆的边界划分)
当大小小于256KB时,Pymalloc将申请存储池中的内存空间。当大于256KB时,新/malloc的行为将直接执行新的内存空间
在Python中的-5和256之间的数据,系统将默认情况下为每个数字分配一个内存区域,然后在有值时指向固定的分配内存区域。
运行PY程序时,解释器将专门分配空白存储器以存储由纯字符(数字,字母,下行)组成的字符串
当字符串分配时,您会首先找到将字符串分配到内存区域并存在的字符串,然后指向现有内存。
1
2
s ='abc'
打印sys.getsizeof(s)
如果要监视所有变量,则可以使用Python的笑脸模块监视所有内存变量
例如,我定义了一条消息
消息testmes {
字符串测试= 1;
}
我只定义了一个字符串。然后我在Python程序中使用了它作为比较
@轮廓
def AddString():
SSS = []
对于我的范围(1000):
info =“ dsdf_sdf” + str(i)
sss.append(信息)
@轮廓
def addtestmes():
SSS = []
对于我的范围(1000):
test_mes = testmes()
sss.append(test_mes)
裁定订单
Python -M Memory_profiler test.py
打印结果是
文件名:testing.py
行#mem用法增量线内容
=====================================
345 19.211 MIB 0.000 MIB @profile
346 def AddString():
347 19.211 MIB 0.000 MIB SSS = []
348 19.219 MIB 0.008 MIB用于I范围(1000):
349 19.219 MIB 0.000 MIB信息=“ $ SDF” + str(i)
350 19.219 MIB 0.000 MIB SSS.Append(INFO)
351 19.219 MIB 0.000 MIB PRINT LEN(SSS)
352 19.219 MIB 0.000 MIB PRINT SSS [999]
文件名:testing.py
行#mem用法增量线内容
=====================================
354 19.219 MIB 0.000 MIB @profile
355 def addtestmes():
356 19.219 MIB 0.000 MIB SSS = []
357 19.977 MIB 0.758 MIB在范围内(1000):
358 19.977 MIB 0.000 MIB test_mes = testmes()
359 19.977 MIB 0.000 MIB SSS.Append(test_mes)
我使用Python String仅使用0.008M内存,并使用Protobuf消息,使用0.758m内存。需要维护很多信息
使用sys.getSizeof方法查看Python对象的内存占用,单位:字节(字节)
实际上,它称为__ sizeof__方法:
Python3和Python2中占据的一些数据类型是不同的,例如范围:
如何计算此值尚未研究?
暂时已知:此值包括一系列数据的总内存,例如对象的值,签名(包括数据类型,参数,调用方法等)。可变对象占据的内存可能很小,因为对象是指针,指向大数据。
众所周知,Python是一种面向对象的语言。在python中,无论是值,字符串,函数还是类型,类和类,它都是对象。
对象是堆上的结构化结构。我们定义的所有变量和函数都存储在堆内存中,变量名称和函数名称是对堆栈中存储并指向堆的特定结构的引用。
要深入了解Python,您首先需要了解Python对象的定义。
我们通常说的Python是Cpython,底层由C语言实现,源代码地址:CPYTHON [GITHUB]
python对象的定义位于include/object.h中。这是一种称为PyObject的结构:
Python中的所有对象均从Pyobejct继承。PyObject包含垃圾回收的两条链接列表。
从pyobejct的注释中,我们可以看到这样的句子:指向变量 - 尺寸python对象的可怜的指针也可以转换为pyvarobject*(在以下内容中可以解释pyvarobject*(可变 - 尺寸尺寸python对象).pyvarobejct)。根据PyObject存储存储元素的数量:
在PyObject结构中,还有一个类型的对象指针OB_TYPE,用于表示哪种类型的Python对象。定义Python对象类型是PyTypeObject接口正文
实际定义是_typeobject,位于include/cpython/object.h:
在这种类型的对象中,不仅是对象的类型,还包括分配内存,对象标准操作等信息,它们主要分为:
以python中的int类型为例,int类型对象的定义如下:
从pyobject的定义来看,我们知道每个对象的ob_type必须指向特定类型对象,例如数值对象100,其ob_type将指向int类型对象pylong_type。
Pytypeobject结构的第一行是PyObject_var_head宏。检查宏定义。
换句话说,在最终分析中,类型的类型也是对象,并且还有一个ob_type属性。Pylong_type的ob_type是什么?
返回到pyvarobject_head_init(pytype_type,0)的第一行,返回Pylong_type的定义,检查相应的宏定义
从上面的关系中,我们可以知道pyvarobject_head_init(pytype_type,0)= {_pyobject_extra_init 1,pytype_type} 0} 0} 0}
这很清楚。Pylong_type的类型是Pytype_typ。可以看出,python类型对象的类型是pytype_type,而pytype_type对象的类型本身本身本身本身
从上面的内容中,我们知道对象和对象类型的定义,因此根据定义,对象可以具有以下两个类别
Python对象用PyObject和PyvarObject定义。因此,根据对象大小是否是可变的,可以将python对象分为变量对象(长期对象)和无法变量对象(固定 - 长度对象)。
原始对象a的大小没有更改,但是引用的对象已更改。对象A和对象B此处是固定长度对象
可以看出,可变l仍指向对象A,但是对象A的内容已更改,并且数据量已更大。请注意,这里是一个长对象
由于上述特征,这两个对象的使用将带来区别:
状态s2 = s,修改s:s ='新字符串'的值,s2的值不会一起变化,因为s2指向一个新对象,s2的旧对象的值不会更改尚未更改的旧对象。
说明L2 = L的值。修改L:L.Append(6)的值。目前,L2的值将共同变化,因为L和L2指向同一对象,并且对象的内容由L。
此外,对于字符串对象,Python还具有一组内存重用机制。如果两个字符串变量变量是相同的值,它们将共享相同的对象:
对于数值对象,Python将在0到2 8内创建一个整数对象,即,共享0至256之间的数值对象:
根据Python数据类型,可以将对象分为以下类别:
有两种方法可以在Python,通用API和类型相关的API中创建对象
这种类型的API通常以pyobject_xxx命名。它可以应用于任何Python对象,例如:
使用pyobjecg_new创建一个数值对象:
这种类型的API通常仅作用于一种类型的对象,例如:
使用Pylong_fromlong创建一个数值对象:
当我们使用Python声明变量时,无需将类型分配给变量。分配变量时,我们可以分配任何类型数据,例如:::
从Python对象的定义来看,我们已经可以知道这种特征的原因。当Python创建一个对象时,将分配内存以进行初始化。一个通用指针PyObject*,指向该指针的对象的类型未修复,只能通过OB_TYPE属性的动态动态来判断物体。
当管理和维护对象管理和维护对象时,Python使用参考计数来确定是否需要破坏内存中的对象。Python中的所有内容都是一个对象,所有对象都有参考计数ob_refcnt。
当对象的参考计数减少到0时,Python将释放对象占用的内存和系统资源。
但这并不意味着最终将发布内存空间,因为频繁释放内存的应用将大大降低Python的执行效率。因此,在Python中使用了内存对象池的技术。它未直接发布。当将来需要应用程序空间时,将从“内存对象池”中优先考虑。
Python程序将在操作过程中分别打开一个过程,许多朋友发现该程序在操作过程中占据的记忆将变得越来越大,但是我不知道原因和解决方法。Python程序内存的原因和解决方案过多。如果您有兴趣和需要,请看看。
苍凉
1.原因
首先要知道的是Python是一种面向对象的编程语言,因此这意味着所有内容都是其程序中的对象。每个对象将打开空间以占据内存中的位置,这将导致初始内存职业。
尽管据说Python具有其自己的内存管理机制和垃圾处理方法,但对于某些占据过多内存的对象,它不会立即发布,并且只有在此对象不在参考状态下时才会处理。
2.解决方案
现在,Python程序内存已被对象占用,正确的解决方案是在呼叫完成后立即删除对象。此方法需要使用关键字DEL和GC模块。在使用DEL关键字删除变量后,请致电GC模块以启动Python垃圾处理机构,以将其直接从存储空间中直接删除。代码示例如下所示:
结论:以上是首席CTO的全部内容指出,有关Python对象的资源占用了多少资源。感谢您花时间阅读本网站的内容。我希望这对您有帮助。不要忘记在此网站上找到它。