python内存管理_Python内存管理(一):预备知识

3351a2f885d2389e647fc8a3dfd78a2d.png

一、内存的理解

你可以将计算机中的内存理解为一本为短期存储而设计的书。这本书中现在什么都没写,但最终不同的“作者”会来寻求空间,写入他们想写的故事。

由于他们之间不能彼此覆盖,他们在开始写入之前一定要向这本书的管理者申请,由管理者来决定他们写入到哪里。

由于这本书会存在很长的时间,书中的很多故事可能已经不再有意义。当没有人读或者引用故事,这些无意义的故事就会被删除,给新的故事腾出空间。

本质上,电脑内存很像是一本空的书。实际上,内存通常被叫做“固定长度的连续内存块”,所以这个类比是很贴切的。作者就像是不同的应用程序或者进程,需要在内存中存储数据。决定作者写内容位置的管理者则扮演各种各样内存管理器的角色。清除旧故事,给新作者提供空间的人就是垃圾回收机制。

二、内存管理:从硬件到软件

内存管理是应用读取、写入数据的流程。内存管理机制决定了在哪里存储应用数据。

就像是我们上面以书为类比,内存块也是有限的,管理机制必须要找出可用的空间并且将其提供给应用。这个提供内存的过程一般被称作内存分配。

另一方面,当数据不再被需要,那么数据可以被删除,或者被释放。但是释放到哪里呢?这个内存从哪里来的?

在你的计算机的某个位置,当你运行你的Python程序时,有一个实体硬件在存储数据。但是在对象实际到达硬件之前,Python代码要经过很多抽象层。

在硬件之上,其中一个主要的抽象层是默认的Python实现(在OS中内置或者你从http://python.org中下载)Python代码中的内存管理是由Python应用程序处理的。本文聚焦Python应用程序在内存管理中使用的结构和算法。

三、默认的Python实现

默认的Python实现,CPython是使用C语言写的。

是不是很震惊?一种语言是用另一种语言写的?好吧,这不是真的,但多少有点。

Python语言在Python参考文档里有详细的讲解,但是光靠文档并不能覆盖一切,我们还是需要一些东西来编译实际代码。我们也需要在计算机上实际执行编译后的代码。默认的Python实现满足这两个要求,它将你的Python代码转化为指令并且将其运行在虚拟机上。

Python是解释型语言,你的Python代码实际上被编译成更底层,更对计算机友好的bytecode指令。当你运行你的代码时,这些指令被虚拟机编译了。你见过.pyc文件或者__pycache__文件夹吗?那就是被虚拟机编译后的bytecode代码。

必须指出,除了CPython之外,还有别的Python实现。Ironpython编译后在Microsoft 的公共语言运行时上运行。Jython编译后成为Java bytecode,在Java虚拟机上运行,还有PyPy,但这个Python实现值得用一篇文章专门介绍,此处不提。

为了理解Python内存管理,我们将聚焦于Python的默认实现——Cpython中所实现的内存管理。本文中涉及到的知识适用于目前的通用版本——Python3.7

好了,我们知道CPython是用C写的,并且编译为Python bytecode,这和内存管理有什么联系呢?是这样的——内存管理算法和结构存在于CPython代码中,用C写的。为了理解Python中的内存管理,我们需要对CPython有一些基本了解。

CPython是用C写的,它本身并不支持面向对象编程。正因如此,在CPython中有很多有趣的设计。你可能听说过Python中一切皆是对象,甚至诸如int、str这样的类型。确实,在CPython的实现级别是这样的。有一个结构叫做PyObject,在CPython中其他object都在使用它。

C中的一个或者多个结构是将不同数据类型组合在一起的自定义数据类型。与面向对象的语言相比,就像是具有属性且没有方法的类。PyObject,所有Python中对象的老祖宗,仅仅包含如下两个部分:

  • ob_refcnt:引用计数
  • ob_type: 指针

引用计数用于垃圾回收机制。你现在有一个指针,指向实际对象类型。该对象类型只是另一种用于描述Python对象的结构(例如dict或者int)

每个对象都有自己的特定对象的内存分配器,该分配器知道如何获取存储该对象的内存,每个对象也有特定对象的内存释放器,用于释放不再被需要的内存。

在我们所有关于分配和释放内存的讨论中,有一个重要的因素。内存是计算机中被共享的资源,如果不同的进程同时写入同一位置,糟糕的事情就会发生。

四、全局解释器锁(GIL)

GIL是在解决共享资源,像是内存这类型的共性问题的有效解决办法。当两个线程同时想要修改相同的资源,他们可能会互相“踩脚趾”,最终的结果可能是乱码,在乱码中,两个线程都没有得到想要的结果。

再考虑一下我们那个用书比作内存的比喻。假设两个作者都固执地一定认为该轮上他来写了,而且他们都要写到书的同一页上。他们忽略了其他人也在创作故事,那么结果就是一页上两个故事相互重叠,整个页面完全不可读。

这个问题的解决办法之一是:在一个线程与共享资源交互时,使用单一的全局解释器锁将该资源上锁。也就是说,同一时间只有一个作者可以写作。

Python的全局解释器锁通过锁住整个解释器来实现这一点。这意味着另一个线程不可能踩到当前的解释器。当CPython处理内存时,使用GIL锁来确保安全。

这种方法有利有弊,也在Python社区引起了激烈讨论。

关于全局解释器锁:

What is the Python Global Interpreter Lock (GIL)? – Real Python​realpython.com
d2ad518176193aae4b3d3d96bab328af.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javacv 人脸检测_使用JavaCV进行手和手指检测

javacv 人脸检测这篇文章是Andrew Davison博士发布的有关自然用户界面(NUI)系列的一部分,内容涉及使用JavaCV从网络摄像头视频提要中检测手。 注意:本章的所有源代码都可以从http://fivedots.coe.psu.ac.th/~ad/jg/nui055/下载。…

vector赋值的常见错误

易范错误1&#xff1a; vector<int> a; for (int i 0; i<10; i) a[i] i; //这种做法以及类似的做法都是错误的。下标只能用于获取已存在的元素&#xff0c;而现在的a[i]还是空的对象 正确做法1&#xff1a; vector<int> a; for (int i 0; i<10; i) a&…

python的pandas库中如何计算每列出现最多的值_Python Pandas中根据列的值选取多行数据...

Pandas中根据列的值选取多行数据# 选取等于某些值的行记录 用 df.loc[df[column_name] some_value]# 选取某列是否是某一类型的数值 用 isindf.loc[df[column_name].isin(some_values)]# 多种条件的选取 用 &df.loc[(df[column] some_value) & df[other_column].isin…

补码运算。

一.补码加法。 先求出两个数的补码。补码相加。最后的结果为补码&#xff0c;若要取得真值需再次求补。超过模的进位需丢掉。二.补码减法。 三.溢出检测 转载于:https://www.cnblogs.com/Ravenzzz/p/10930014.html

Oracle JDK 9 Early Access文档已更新

Raymond Gallardo在2017年4月4日发布的针对Oracle JDK 9的抢先体验文档 已更新&#xff0c;今天宣布对Oracle JDK9文档的抢先体验页面进行了更新。 Gallardo重点介绍了一些更新的部分&#xff0c;包括Oracle JDK 9的新增功能 &#xff0c; Oracle JDK 9迁移指南 &#xff0c; H…

python 读取当前文件夹下所有后缀为.lib文件

# -*- coding: utf-8 -*-import os def file_name(file_dir):for root, dirs, files in os.walk(file_dir):#print(root) # 当前目录路径#print(dirs) # 当前路径下所有子目录print(files) # 当前路径下所有非目录子文件file_name(file_dir) #输出当前文件夹下所有后缀为.li…

python分割字符串输出_python字符串分割

内置split()函数 str.split(sepNone, maxsplit-1)sep为自定义分割符&#xff0c;maxsplit为最大分割次数&#xff0c;默认值-1进行全部分割注意以下区别&#xff1a;str.split() 以空格分割&#xff0c;包括连续空格str.split( ) 同样以空格分割&#xff0c;但是不能识别连续空…

python requests 10041报错_Python-Requests1-批量登录获取uid

需求&#xff1a;从表格取不同的手机号和密码登录&#xff0c;获取不同用户的信息&#xff0c;写入本地表格requests官网&#xff1a;https://github.com/requests/requests1、安装Requests模块1、官网下载requests包2、解压&#xff0c;命令行进入python目录&#xff0c;运行安…

pdf保存如何带批注_带有批注的SpringSelenium测试

pdf保存如何带批注这篇文章描述了如何在Java中实现Selenium测试。 它的灵感来自Alex Collins的帖子&#xff0c;并带有注释。 该代码可在GitHub的Spring-Selenium-Test目录中找到。 一些替代方法和更轻巧的技术可用于对Spring MVC应用程序进行单元测试。 要进行单元测试服务&am…

javax.naming.NamingException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver'

解决办法&#xff1a; Tomcat服务器的根目录下也有一个lib目录,也要把mysql的驱动包放进去转载于:https://www.cnblogs.com/kingdaqi/p/10935916.html

Spring教程:使用Spring框架和Spring Boot创建Hello World REST API

由于Java社区对早期版本的Enterprise Java感到失望&#xff0c;因此创建了Spring Framework 。 从那时起&#xff0c;它已经发展成为一个巨大的生态系统&#xff0c;可以解决构建基于Web的Java应用程序中的所有问题以及更多问题。 经常批评Spring&#xff0c;因为Spring过去常常…

Testner自动化测试平台免费开放啦

swift&#xff08;雨燕&#xff09;是目前世界上飞行速度最快的鸟之一&#xff0c;尖尾雨燕平时飞行的时速为170公里&#xff0c;最快可达到325.5公里。恰恰自动化测试的主要目的就是为了提高测试效率&#xff0c;因此&#xff0c;Testner自动化测试平台也叫 swift Testner自动…

seleniumpython定位网页元素方法_使用Selenium对网页元素进行定位的诸种方法

使用Selenium进行自动化操作&#xff0c;首先要做的就是通过webdriver的get()方法打开一个URL链接。在打开链接&#xff0c;完成页面加载之后&#xff0c;就可以通过Selenium提供的接口&#xff0c;在页面上进行各种操作了&#xff0c;下面我们来了解一下如何在查找元素。3.1 查…

有赞全链路压测方案

转载于:https://www.cnblogs.com/wuzhiyi/p/10944934.html

python 消息队列 get是从队首还是队尾取东西_python分布式爬虫中消息队列知识点详解...

当排队等待人数过多的时候&#xff0c;我们需要设置一个等待区防止秩序混乱&#xff0c;同时再有新来的想要排队也可以呆在这个地方。那么在python分布式爬虫中&#xff0c;消息队列就相当于这样的一个区域&#xff0c;爬虫要进入这个区域找寻自己想要的资源&#xff0c;当然这…

mime类型是什么类型_使用多种MIME类型测试REST

mime类型是什么类型1.概述 本文将重点介绍测试具有多种媒体类型/表示形式的RESTful服务。 这是有关使用Spring和基于Java的配置的Spring Security设置安全的RESTful Web服务的系列文章的第十篇。 REST with Spring系列&#xff1a; 第1部分 – 使用Spring 3.1和基于Java的配置…

Go-Mutex互斥量

先来看一段go1.12.5中Mutex的源码&#xff1a; // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file.// Package sync provides basic synchronization primiti…

spss方差分析_【案例】SPSS统计分析:多因素方差分析

&#xff0d; 点击上方“中国统计网”订阅我吧&#xff01;&#xff0d;多因素方差分析&#xff0c;用于研究一个因变量是否受到多个自变量(也称为因素)的影响&#xff0c;它检验多个因素取值水平的不同组合之间&#xff0c;因变量的均值之间是否存在显著的差异。多因素方差分…

你好世界

想打个Hello World&#xff0c;但是又没有继续下去。 今天买茶百道的时候&#xff0c;做茶的女孩子很开朗很友善&#xff0c;在她递给我装好的山竹荔枝的时候我闻到水果的苦味&#xff0c;于是捧住杯子埋头下去闻了一下&#xff0c;她笑着说&#xff0c;“每次我做这个的时候都…

sqlserver免安装_SQL数据分析,如何免安装在线运行?

大家好&#xff0c;在之前写了一篇关于SQL软件安装&#xff0c;读者普遍反映&#xff0c;这个软件有点不好安装&#xff0c;但是&#xff0c;从事数据分析行业&#xff0c;熟练使用SQL软件是必须的&#xff0c;于是乎......本文推送一篇免安装的&#xff0c;可以在线运行的SQL软…