-
python释放变量内存_Python变量内存管理
2020-11-29 21:10:41一、变量存哪了?...我们再回顾变量运行的三个过程,如果我们没有使用python解释器运行p1.py这个文件,那么x=10很明显只是很普通的四个字符x、=、1、0。而只有Python解释器运行了这个文件,那字...一、变量存哪了?
x = 10
当我们在p1.py中定义一个变量x = 10,那么计算机把这个变量值10存放在哪里呢了?我们回顾计算机的三大核心组件为:CPU、内存和硬盘。一定不是CPU,那是存放在内存还是硬盘中了呢?我们再回顾变量运行的三个过程,如果我们没有使用python解释器运行p1.py这个文件,那么x=10很明显只是很普通的四个字符x、=、1、0。而只有Python解释器运行了这个文件,那字符进入了内存,才会有变量这个概念。也就是说变量是存放在内存当中的。
变量存放在内存中这句话太宽泛了,我们把它具体化。现在想象我们在学校(电脑内存)里上课,学校每开一个班,学校都会开辟一个教室给这个班级上课用(存放变量值10),而班级的门牌号则是(变量名x)。也就是说,对于电脑内存这个大内存,每定义一个变量就会在这个大内存中开辟一个小空间,小空间内存放变量值10,然后内存给这个小空间一个变量名x(门牌号),x指向10。
二、Python垃圾回收机制
对于p1.py,如果我们再加上一段代码x = 11,大内存会开辟另一个小空间存储变量值11,把变量值绑定另一个门牌号x,但是由于之前有x,所以大内存会解除x与10的连接,让x与11连接。这个时候10由于没有了门牌号,所以成为了python眼中的垃圾,python就会处理这个垃圾,释放10的内存占用,这就是python的垃圾回收机制。而其他语言需要手动把10的内存占用释放掉。
2.1 引用计数
从上述的解释我们可以知道只要某个变量值绑定着门牌号,就不是垃圾,反之变量值没有绑定着门牌号,这个变量值就是垃圾,python就会自动清理这个垃圾。这里我们对于这个门牌号给定一个专业的解释,在python中这个门牌号被称作引用计数。
x = 10 # 10引用计数加1为1
y = x # 10引用计数加1为2
x = 11 # 10引用计数减1为1;11引用计数加1为1
del y # 10引用计数减1为0,触发python垃圾回收机制,python清理10的内存占用
上述代码就是一个引用计数加减的过程。
三、小整数池
对于上一节讲的引用计数,需要注意的是:Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是[-5,256],该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被垃圾回收机制回收。
在pycharm中运行python程序时,pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也都包含在内一便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,无需细究。
-
python释放变量内存_2020Python面试题:Python是如何进行内存管理的?
2020-12-07 12:22:09这也是为什么我们称Python语言为动态类型的原因(这里我们把动态类型可以简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值)。二、引用计数:Python采用了类似Wind...Python面试,Python面试题
一、垃圾回收:
Python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值。对Python语言来讲,对象的类型和内存都是在运行时确定的。这也是为什么我们称Python语言为动态类型的原因(这里我们把动态类型可以简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值)。
二、引用计数:
Python采用了类似Windows内核对象一样的方式来对内存进行管理。每一个对象,都维护这一个对指向该对对象的引用的计数。当变量被绑定在一个对象上的时候,该变量的引用计数就是1,(还有另外一些情况也会导致变量引用计数的增加),系统会自动维护这些标签,并定时扫描,当某标签的引用计数变为0的时候,该对就会被回收。
三、内存池机制
Python的内存机制以金字塔行,-1,-2层主要有操作系统进行操作,
第0层是C中的malloc,free等内存分配和释放函数进行操作;
第1层和第2层是内存池,Python的接口函数PyMem_Malloc函数实现,当对象小于256K时有该层直接分配内存;
第3层是最上层,也就是我们对Python对象的直接操作;
在 C 中如果频繁的调用 malloc 与 free 时,是会产生性能问题的.再加上频繁的分配与释放小块的内存会产生内存碎片. Python 在这里主要干的工作有:
如果请求分配的内存在1~256字节之间就使用自己的内存管理系统,否则直接使用 malloc.
这里还是会调用 malloc 分配内存,但每次会分配一块大小为256k的大块内存.
经由内存池登记的内存到最后还是会回收到内存池,并不会调用 C 的 free 释放掉.以便下次使用.对于简单的Python对象,例如数值、字符串,元组(tuple不允许被更改)采用的是复制的方式(深拷贝?),也就是说当将另一个变量B赋值给变量A时,虽然A和B的内存空间仍然相同,但当A的值发生变化时,会重新给A分配空间,A和B的地址变得不再相同
以上是酷仔今天分享的“2020Python面试题:Python是如何进行内存管理的?”一文,希望对Python面试有需求的同学提供帮助,后续酷仔会持续提供Web前端面试、Python面试题相关内容。
特殊说明:以上内容资料由开课吧提供
-
python释放变量内存_大厂面试必问Python是如何管理内存的?
2020-12-07 12:22:29但是我们在写Python的时候好像从来没有关心过内存的处理,为什么可以这么爽?在你爽的背后,实际上是Python在默默的帮你管理着,具体怎么实现的,听我慢慢道来。一、引用计数:在Python中,使用了引用计数这一技术...如果写过C和C++的小伙伴肯定都知道,程序中的内存管理是非常关键的,一不小心可能就会产生内存泄漏。但是我们在写Python的时候好像从来没有关心过内存的处理,为什么可以这么爽?在你爽的背后,实际上是Python在默默的帮你管理着,具体怎么实现的,听我慢慢道来。
一、引用计数:
在
Python
中,使用了引用计数这一技术实现内存管理。一个对象被创建完成后就有一个变量指向他,那么就说明他的引用计数为1,以后如果有其他变量指向他,引用计数也会相应增加,如果将一个变量不再执行这个对象,那么这个对象的引用计数减1。如果一个对象没有任何变量指向他,也即引用计数为0,那么这个对象会被Python
回收。示例代码如下:class Person(object):
def __init__(self,name):
self.name = name
def __del__(self):
print('%s执行了del函数'%self.name)
while True:
p1 = Person('p1')
p2 = Person('p2')
del p1
del p2
a = input('test:')可以看到,两个对象的del函数都得到了执行。
二、循环引用:
引用计数这一技术虽然可以在一定程度上解决内存管理的问题。但是还是有不能解决的问题,即循环引用。比如现在有两个对象分别为a和b,a指向了b,b又指向了a,那么他们两的引用计数永远都不会为0。也即永远得不到回收。看以下示例:
class Person(object):
def __init__(self,name):
self.name = name
def __del__(self):
print('%s执行了del函数'%self.name)
while True:
p1 = Person('p1')
p2 = Person('p2')
# 循环引用后,永远得不到释放
p1.next = p2
p2.prev = p1
del p1
del p2
a = input('test:')可以看到,del函数是不会运行的,是因为循环引用导致两个对象得不到释放。
三、标记清除和分代回收:
在
Python
程序中,每次你新创建了一个对象,那么就会将这个对象挂到一个叫做零代链表中(当然这个链表是Python内部的,Python开发者是没法访问到的)。比如现在你在程序中创建四个Person
对象,分别叫做p1
、p2
、p3
以及p4
,然后p1
与p2
之间互相引用,并且让p3
和p4
的引用计数为2,示例代码如下:import sys
class Person(object):
def __init__(self,name):
self.name = name
self.next = None
self.prev = None
p1 = Person('p1')
p2 = Person('p2')
p3 = Person('p3')
p4 = Person('p4')
p1.next = p2
p2.prev = p1
temp1 = p3
temp2 = p4
print(sys.getrefcount(p1))
print(sys.getrefcount(p2))
print(sys.getrefcount(p3))
print(sys.getrefcount(p4))以上代码实际上就会将
p1
和p2
以及p3
和p4
挂在一个叫做零代链表中,示例图如下:我们可以看到,这时候
p1
引用了p2
,而p2
又引用了p1
,因此这两个对象产生了循环引用。在后期即使我删除了del p1
以及del p2
,那么这两个对象也会得不到释放。因此这时候
Python
就启用了一个新的垃圾回收的机制。如果创建的对象总和减去被释放的对象,达到一定的值(某个阈值),那么Python
就会遍历这个零代链表,找到那些有相互引用的对象,将这些对象的引用计数减1,如果引用计数值为0了,那么就说明这个对象是可以被释放的,比如以上p1
和p2
,这时候就会释放p1
和p2
。接下来再将没有被释放的对象,挪动到一个新的链表中,这个链表叫做一代链表。在零代链表清理的次数达到某个阈值后,Python会去遍历一代链表,将那些没有得到释放的对象移动到二代链表。同样的原理,如果一代链表清理的次数达到某个阈值后,Python会去遍历二代链表,把垃圾对象进行回收。
四、弱代假说:
来看看代垃圾回收算法的核心行为:垃圾回收器会更频繁的处理新对象。一个新的对象即是你的程序刚刚创建的,而一个来的对象则是经过了几个时间周期之后仍然存在的对象。Python会在当一个对象从零代移动到一代,或是从一代移动到二代的过程中提升(promote)这个对象。
为什么要这么做?这种算法的根源来自于弱代假说(weak generational hypothesis)。这个假说由两个观点构成:首先是年轻的对象通常死得也快,而老对象则很有可能存活更长的时间。
假定现在我用Python创建一个新对象:
根据假说,我的代码很可能仅仅会使用ABC很短的时间。这个对象也许仅仅只是一个方法中的中间结果,并且随着方法的返回这个对象就将变成垃圾了。大部分的新对象都是如此般地很快变成垃圾。然而,偶尔程序会创建一些很重要的,存活时间比较长的对象-例如web应用中的session变量或是配置项。
通过频繁的处理零代链表中的新对象,Python的垃圾收集器将把时间花在更有意义的地方:它处理那些很快就可能变成垃圾的新对象。同时只在很少的时候,当满足阈值的条件,收集器才回去处理那些老变量。
-
python释放变量内存_Python少儿编程系列-第6课-内存变量的输入输出和处理
2020-11-24 20:46:50那么我们怎么让python知道把一个东西保存再内存中的一个位置呢?又怎么再需要的时候找到这个位置,找到我们之前保存的内容的呢? 首先我们需要给我们保存的东西起一个名字,就像想我们自己的名字一样, 然后python...计算机大体有三部分组成:输入-控制-输出
我们第二个程序猜数字游戏就包含了这三个部分,
输入:我们要输入一个数字,也就是你猜测的数字
处理:计算机会判断你输入的数字是否正确,并且记录猜过几次
输出:程序打印出的信息
看下面图片是不是很熟悉,再游戏中输入时游戏手柄,处理程序确定你的操作是否击中对方,或者避开对方攻击等。输出时屏幕上的图形,扬声器等。
可以想想平时的电脑设备中那些属于输入,那些输入输出,那些时控制部分呢?
上面的 输入和输出我们都很好理解,对于控制处理部分可能很多同学很迷糊,那么我们一起来看一下,计算机时怎么处理输入的呢?计算机会把输入保存在某个地方,我们称之为内存。
那么我们怎么让python知道把一个东西保存再内存中的一个位置呢?又怎么再需要的时候找到这个位置,找到我们之前保存的内容的呢?
首先我们需要给我们保存的东西起一个名字,就像想我们自己的名字一样,
然后python会给这个东西留出空间,这部分内容可能时视频,图片,文本等,以后我们想用这个东西只要使用这个名字就可以了。
-
python释放变量内存_python解释器安装,运行python程序的方式及程序运行的步骤,变量与自动的内存管理...
2020-12-07 12:22:12一、python解释器安装ps: 注意设置环境变量(文件是操作系统的概念,操作系统优先在当前文件夹找,找不到就到环境变量path找) python解释器不兼容 解释器下载官网:http://python.org二、运行python程序的方式及... -
python释放变量内存_看完2019年阿里巴巴Python面试题详解,月薪3万不是梦
2020-12-07 05:29:05很多人想自学Python找工作,下面给大家分享一部分阿里巴巴的Python开发工程师的面试题目:概念理解类题目:1.请说一下你对迭代器和生成器的区别?答:(1)迭代器是一个更抽象的概念,任何对象,如果它的类有next方法... -
python释放变量内存_Python尚学堂高淇|1113引用的本质栈内存,堆内存,内存的示意图,标识符,变量的声明...
2020-12-07 11:05:58011-引用的本质-栈内存和堆内存-内存的示意图在Python当中,变量也成为:对象的引用,因为,变量的存储就是对象的地址变量通过地址引用了对象变量位于堆内存(压栈,出栈等细节,后续再介绍)对象位于:堆内存Python是... -
python释放变量_Python中的内存管理机制
2021-01-12 09:51:59Python的内存管理机制:引入计数、垃圾回收、内存池机制一、引入计数1、变量与对象变量赋值的时候才创建,它可以指向(引用)任何类型的对象python里每一个东西都是对象,它们的核心就是一个结构体:PyObject变量必须... -
python 释放线程内存_python变量内存地址释放与加速并行计算多线程
2020-12-10 07:52:221、导入numba和gc包进行并行计算和内存释放代码如下很容易的:#coding:utf-8import timefrom numba import jit, prange, vectorizefrom numba import cudafrom numba import njitimport numpy as npimport gcdef ... -
python 释放变量所指向的内存_通俗易懂的Python垃圾回收机制及内存管理
2020-12-23 08:13:48Python垃圾回收机制及内存管理 内存管理:先定义一个变量 name=‘wxl’那么python会在内存中开辟一小块区域存放“wxl",此时变量的值是我们真正想要存储的,wxl指向了name。那么我们通过name就可以找到“wxl”.当wxl... -
python释放部分变量的内存_Python内存管理机制
2021-02-02 22:32:02什么是内存管理器Python作为一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言,与大多数编程语言不同,Python中的变量无需事先申明,变量无需指定类型,程序员无需关心内存管理,Python解释器给你自动... -
python释放部分变量的内存_什么是 Python 的 “内存管理机制”?
2021-02-02 22:32:02Python中的变量无需事先申明,变量无需指定类型,程序员无需关心内存管理,Python解释器给你自动回收。开发人员不用过多的关心内存管理机制,这一切全部由python内存管理器承担了复杂的内存管理工作。内存不外乎创建... -
python 删除变量释放内存_python 内存释放问题,高手请帮帮忙
2020-12-19 11:45:59该楼层疑似违规已被系统折叠隐藏此楼查看此楼我重复一楼的问题,range(1024*1024)确实占用很大内存,但是del后,内存几乎是马上就释放了,没有内存持续占用问题。我测试操作系统是macox10.5.6在实际应用中,range对... -
python 释放变量所指向的内存_Python:是“旧的”为变量分配新内容时是否释放了内存?...
2021-01-17 18:26:36in the following script, will the memory for variable "a" as an array of zeros be free'd after "a" is assigned some new stuff import numpy a = numpy.zeros(1000) a = a+1 I would imaging Python is ... -
python变量使用可以用del释放资源_python如何释放内存
2020-12-06 03:53:47关于Python中的内存释放问题首先就不得不提到Python解释器在何种情况下会释放变量的内存。Python引用了内存计数这一简单的计数来控制。云海天教程网,大量的免费python教程,欢迎在线学习!下面是引用计数的知识:1)... -
python 释放变量所指向的内存_Go 的 GC 不怕变量间循环依赖
2020-11-27 06:24:40和普通 pointer 相比,shared_ptr 会维护一个 reference count,当 reference count 等于零的时候,shared_ptr 便会释放所维护的内存。shared_ptr 有一个缺点是它不太容易处理循环依赖(circular depend... -
python 释放变量所指向的内存_免费视频教程!零基础学Python系列(3) 理解“变量”...
2020-12-20 12:46:49点击跟哥一起学Python关注我们python变量(上)python变量(下)实例源码本节视频涉及到的实例源码,可以在百度网盘中下载。在公众号对话框回复关键字“网盘地址”,获取网盘链接和提取码。课件我们把前面的程序稍微改... -
python释放变量_Python中的垃圾回收机制(上)
2021-01-15 04:03:11这篇文章描述的是python最新版本...内存管理不像其他的一些编程语言,python不会直接将一些已经释放的内存直接归还给操作系统。相反,python的内存管理机制将会管理这些内存,在将来如果需要分配一些小于512字节的对... -
python线程执行完后释放内存_python变量内存地址释放与加速并行计算多线程
2020-11-26 03:18:221、导入numba和gc包进行并行计算和内存释放代码如下很容易的:#coding:utf-8import timefrom numba import jit, prange, vectorizefrom numba import cudafrom numba import njitimport numpy as npimport gcdef ... -
当退出python时是否释放全部内存_python如何释放内存
2020-11-23 17:35:46关于Python中的内存释放问题首先就不得不提到Python解释器在何种情况下会释放变量的内存。Python引用了内存计数这一简单的计数来控制。python学习网,大量的免费python视频教程,欢迎在线学习!下面是引用计数的知识... -
numpy 释放变量内存_python&numpy的赋值
2021-01-31 02:28:20有点编程基础的童鞋看到这个...一般的python程序需要赋值时的确是通过等号(=)实现的,不管是变量还是数组,例如:i=1pi=3.1415926x=numpy.arange(1,10)也可以实现一些稍微复杂的操作:ilon=90jlat=40corr = Corr_pio... -
python变量的内存管理
2019-09-22 13:58:37# print(100) # print会自动帮你创建一个变量100,打印完之后,马上释放100的内存空间 定义一个变量,内存就开辟一个内存空间存储这个变量 二、python的垃圾回收机制 我们先来看一段代码: x = 10 #定义一个变量x=10 x ... -
python类变量共享吗_python 类变量在多线程下共享与释放问题
2021-02-04 08:56:28最近被多线程给坑了下,没意识到类变量在多线程下是共享的,还有一个就是没意识到 内存释放问题,导致越累越大1.python 类变量 在多线程情况 下的 是共享的2.python 类变量 在多线程情况 下的 释放是不完全的3.... -
python变量可以使用del释放资源_什么是Python的 “内存管理机制”
2020-12-30 00:24:35什么是内存管理器(what)Python作为一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言,与大多数编程语言不同,Python中的变量无需事先申明,变量无需指定类型,程序员无需关心内存管理,Python解释器给... -
python变量内存地址释放与加速并行计算多线程
2019-04-06 01:49:001、导入numba和gc包进行并行计算和内存释放 代码如下很容易的: #coding:utf-8 import time from numba import jit, prange, vectorize from numba import cuda from numba import njit import numpy ... -
python局部变量转全局变量_python局部变量和全局变量
2021-03-06 03:32:34python局部变量和全局变量发布时间:2020-08-31 00:01:13来源:51CTO阅读:98作者:qq5d6f345f0205e在python开发中,变量也是有生命周期的,一旦周期结束,程序会自动清理暂用的空间,释放内存,变量分为两者,一种... -
Python如何释放内存
2019-09-23 08:48:09一般我会直接用del来删除变量,但是对于占用内存较大的对象,del 并不管用,删除了内存也没见减小。有一个解决办法就是调用gc(垃圾回收)模块,就能立刻释放内存。哦,我刚才百度到一个词,叫内存泄漏。 “内存... -
python内存管理 变量无需事先声明_关于python本身的内存管理
2021-01-29 10:22:47一、在python中,变量和内存管理的特点1、变量无需事先声明2、变量无需指定类型3、程序员不用关心内存的管理问题4、变量名会被回收5、del语句能够直接释放资源二、内存分配问题在为变量分配内存的时候,其实实在借用...