python分配内存_CPython内存分配

其中大部分内容在C API文档的

Memory Management章节中得到回答.

一些文档比您要求的更容易.有关详细信息,您必须转到源代码.没有人会愿意这样做,除非你选择一个特定的版本. (至少2.7.5,2.7.6,3.3.2之前,3.3.3之前和3.4之前对于不同的人来说将是有趣的.)

obmalloc.c文件的来源是您的许多问题的良好起点,顶部的评论有一个不错的小ASCII艺术图:

Object-specific allocators

_____ ______ ______ ________

[ int ] [ dict ] [ list ] ... [ string ] Python core |

+3 | | |

_______________________________ | |

[ Python`s object allocator ] | |

+2 | ####### Object memory ####### | |

______________________________________________________________ |

[ Python`s raw memory allocator (PyMem_ API) ] |

+1 | | |

__________________________________________________________________

[ Underlying general-purpose allocator (ex: C library malloc) ]

0 | |

=========================================================================

_______________________________________________________________________

[ OS-specific Virtual Memory Manager (VMM) ]

-1 | |

__________________________________ __________________________________

[ ] [ ]

-2 | | | |

how many different allocaters are there in CPython?

根据文件,“几”.你可以计数内建和stdlib类型的数据,然后添加一些通用的,如果你真的想要的.但我不知道会告诉你什么. (这将是相当的版本特定的.IIRC,确切的数字甚至在3.3树中更改,因为有一个实验,新的风格的字符串是否应该使用三个不同的分配器或一个).

what is the function of each?

3级的特定于对象的分配器是针对特殊用途的值得优化的情况.正如文件所说:

For example, integer objects are managed differently within the heap than strings, tuples or dictionaries because integers imply different storage requirements and speed/space tradeoffs.

在这之下,有2类(和1.5和2.5)的各种通用的支持分配器 – 至少是一个对象分配器,一个竞技场分配器和一个小块分配器等等,但除了第一个是私有实现细节之外意味着私有甚至C-API;显然所有这些都是Python代码的私有).

而在此之下,有一个原始的分配器,其功能是在更高级别的分配器需要时询问操作系统的更多内存.

when is malloc acutally called?

原始内存分配器(或其堆管理器)应该是唯一一个调用malloc的东西. (事实上​​,它可能不一定会调用malloc;它可能会使用诸如mmap或VirtualAlloc之类的函数,但关键是它是唯一要求操作系统进行内存的操作.)Python内核中有一些例外,但它们很少有关系.

文档明确地说,更高级别的代码不应该尝试在从malloc获取的内存中对Python对象进行操作.

但是,除了Python对象之外,还有很多使用malloc的stdlib和扩展模块.

例如,1000×1000 int32值的numpy数组不会分配1百万个Python int,因此它不必经过int allocator.相反,它只是mallocs一个100万C int的数组,并根据需要在Python对象中包装它们访问它们.

How much memory does python allocate for itself at startup?

这是平台特定的,有点难以从代码中找出.但是,当我在64位Mac上启动一个新的python3.3解释器时,它的起始于13.1MB的虚拟内存,几乎立即扩展到201MB.所以,这应该是一个粗略的球场指南.

are there rules governing which data structures get first “dibs” on this memory?

不是真的,不行一个恶意或buggy对象特定的分配器可以立即抓住所有预分配的内存和更多,没有什么可以阻止它.

What happens to the memory used by an object when it is deleted (does python still hold on to the memory to allocate to another object in the future, or does the GC free up the memory for another process, say Google Chrome, to use)?

它可以返回到特定于对象的分配器,它可以将其保存在freelist上,或者将其释放到原始分配器中,该分配器保持自己的freelist.原始分配器几乎不会将内存释放回操作系统.

这是因为通常没有理由将内存释放回现代操作系统.如果您有大量未使用的页面,则操作系统的虚拟机将仅在另一个进程需要时才将其打印出来.当有一个很好的理由,它几乎总是应用程序特定的,最简单的解决方案是使用多个进程来管理你的巨大的短期内存需求.

When is a GC triggered?

这取决于你的意思是“一个GC”.

CPython使用refcounting;每次您释放对对象的引用(通过重新绑定变量或集合中的插槽,使变量超出范围等),如果是最后一个引用,它将立即被清除.这在文档的Reference Counting部分进行了说明.

然而,引用计数有一个问题:如果两个对象相互引用,即使所有外部引用都消失,它们仍然不会被清除.所以,CPython一直有一个循环收集器,周期性地移动对象来寻找彼此引用的对象的周期,但没有外部引用. (这是一个更复杂一点,但这是基本的想法.)这在gc模块的文档中有完整的解释.收藏者可以在明确要求的时候运行,当自由职业者越来越少,或者长时间没有运行的时候;这是动态的,在某种程度上是可配置的,所以很难给出“何时”的具体答案.

lists are dynamic arrays, which means they need a contiguous piece of memory. This means that if I try to append an object into a list, whose underlying-C-data-structure array cannot be extended, the array is copied over onto a different part of memory, where a larger contiguous block is available. So how much space is allocated to this array when I initialize a list?

这个代码主要在listobject.c年以前.这很复杂有一些特殊情况,例如timsort用于创建临时中间列表和非就地排序的代码.但是最终,一些代码决定了它需要N个指针的空间.

这也不是特别有趣.大多数列表从未扩展或扩展远远超出原始大小,因此在开始时额外分配会浪费静态列表的内存,并且对大多数日益增长的列表来说无益.所以,Python是保守的.我相信它是通过查看其内部freelist开始的,它不会比N个指针大得多(它也可能会整合相邻的释放列表存储;我不知道是否这样做),所以它可能会偶尔过度分配,但一般来说没有.确切的代码应在PyList_New.

无论如何,如果列表分配器的freelist中没有空格,它将下降到对象分配器,依此类推;它可能会达到0级,但通常不会.

how much extra space is allocated to the new array, which now holds the old list and the appended object?

这是在list_resize处理的,这是有趣的部分.

避免list.append是二次方法的唯一方法是过度分配几何.超过一个因素(如1.2)过度分配浪费了前几次扩张的时间太多;使用太大的因素(如1.6)浪费太多的空间,用于非常大的阵列. Python通过使用从2.0开始的序列来处理这个问题,但是快速收敛到大约1.25的地方.根据3.3来源:

The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, …

你没有特别询问排序,但我知道这是什么促使你.

请记住,timsort主要是一种合并排序,对尚未排序的小型子列表进行插入排序.所以,它的大部分操作涉及分配一个大约2N的新列表,并释放两个大小为N的列表.所以,当它们就地复制时,它几乎可以像空间和分配一样高效.有最多的O(日志N)浪费,但这通常不是使复制排序更慢的因素.

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

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

相关文章

现代版的大案牍术:数字孪生在城市的应用

来源:阿里研究院最近大火的电视剧《长安十二时辰》中,靖安司大规模启用秘密核武器——大案牍术,书吏们从各个部门汇总来的人员往来、钱粮货物流水中寻找到蛛丝马迹甚至未卜先知,再结合长安版的5G通讯——望楼通信与大沙盘&#xf…

关于样式表setStyleSheet

在Qt中设置widget背景颜色或者图片方法很多种:重写paintEvent() , 调色板QPalette , 样式表setStyleSheet等等。 但是各种方法都有其注意事项,如果不注意则很容易陷入麻烦中。 1:setStyleSheet() 这个函数我一直很喜欢使用,因为只…

react打包后图片丢失_使用 webpack 搭建 React 项目

简评:相信很多开发者在入门 react 的时候都是使用 create-react-app 或 react-slingshot 这些脚手架来快速创建应用,当有特殊需求,需要修改 eject 出来的 webpack 配置文件时,面对各种配置项不知如何下手,本文会介绍如…

揭秘5G+AI时代的机器人世界!七大核心技术改变人类生活【附下载】| 智东西内参...

来源: 智东西AI 和 5G 与机器人技术结合,正在不断催生新的消费电子品类。AI 解决机器理解世界,以及人机交互的问题。5G 拓展机器人的活动边界,并为机器人提供更大的算力和存储空间(云协作机器人) 。根据 IF…

TSQL编程

1.索引添加索引,设计界面,在任何一列前右键--索引/键--点击进入添加某一列为索引 2.视图 视图就是我们查询出来的虚拟表创建视图:create view 视图名 as SQL查询语句,分组,排序,in 等都不能写视图的用法: s…

python方向键控制角色_用python和pygame游戏编程入门-控制角色移动

在上一节中我们知道了事件,以及如何捕捉键盘事件进行响应,本届我们结合第一节何上一节的内容,做一个用键盘控制角色移动的功能,代码如下: #!/usr/bin/env python #指定图像文件名称 background_image_filename ./img/…

arcgis fishnet 单位_ArcGIS中使用Create Fishnet生成格网

ArcGIS中使用Create Fishnet生成格网1.如果单元格的宽和高定义为0,那么必须指定行与列的数目以及格网对角的坐标2.格网的范围可以手动输入,也可以引用已有数据为模板。如果输入一个模版,格网的起始坐标和Y轴的坐标就被自动填充了,…

让人工智能有情感的秘诀!清华权威报告看透情感计算【附下载】

来源: 智东西40 多年前,诺贝尔奖得主 Herbert Simon 在认知心理学方面强调,解决问题论要结合情感的影响。情感的识别和表达对于信息的交流和理解是必需的,也是人类最大的心理需求之一。人类的认知、行为等几乎都要受到情感的驱动&…

端口扫描的目的

端口扫描的目的是扫描大范围的主机连接一系列的 TCP 端口,判断主机开放了哪些服务,这些开放的端口往往与一定的服务相对应,通过这些开放的端口,就能了解主机运行的服务,然后就可以进一步整理和分析这些服务可能存在的漏…

记录用户转成超级用户的文件名字_一分钟了解Linux用户

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资…

桥接模式和nat模式

一、桥接模式(bridged networking) 在桥接模式下,VMWare虚拟出来的操作系统就像是局域网中一台独立的主机,它能够访问网内任何一台机器。 在桥接模式下,你必须手工为虚拟系统配置IP地址、子网掩码,并且还要…

四维图新地图坐标_移动端地图技术分享

本人现就职于国内某地图导航公司,这篇文章是我前段时间在公司组织技术分享的一个PPT,文章内容也主要由这个PPT的内容为主,通过这篇文章可以很好的帮你了解地图导航这个行业的相关技术。PPT内容主要包括地图相关专业知识、百度和高德SDK整体框…

重磅!2019年诺贝尔生理学或医学奖揭晓,“细胞感知氧气通路”摘得桂冠

来源:奇点网北京时间2019年10月7日17点30分,2019年诺贝尔生理学或医学奖揭晓,得主为William G. Kaelin Jr,Peter J. Ratcliffe和Gregg L. Semenza,获奖理由为“他们发现了细胞如何感知和适应氧气供应”。William G. Ka…

HTTP深入浅出 http请求

HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则。计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务,HTTP目前协议的版本是1.1.HTTP是一种无状态的协议&#xff0c…

大一python基础编程试卷_2020大学慕课Python编程基础试题及答案

2020大学慕课Python编程基础试题及答案更多相关问题 四川总面积48.6万平方公里,居全国第()位。 国民经济恢复是在() 马化腾是独自创立了腾讯公司 智慧职教: 颈静脉搏动可见于 马化腾是独自创立了腾讯公司 下列各项中,对于会计核算…

vue 找回密码_vue实现个人信息查看和密码修改功能

下面一段代码给大家介绍vue实现个人信息查看和密码修改功能,具体代码如下所述://用了element组件,自己要加载和引入保存保存//这些不要在意,这些是我们自定义的接口,用的时候就直接拿来了import {fetchall,fetchbyid,f…

世界十大最美方程式

来源:数学职业家自从科学诞生后,不可避免地就会用到方程式,这些方程式以其独特的作用服务于人类的生产创造以及各门学科。而最近几百年的时间,更是方程式数量极大增加的时候,同时也是科学技术突飞猛进的年代。从侧面看…

160826、浏览器渲染页面过程描述,DOM编程技巧以及重排和重绘

一、浏览器渲染页过程描述 1、浏览器解析html源码,然后创建一个DOM树。 在DOM树中,每一个HTML标签都有一个对应的节点(元素节点),并且每一个文本也都有一个对应的节点(文本节点)。 DOM树的根节点就是documentElement,对应的是html标签。 2、浏…

小程序 pagescrollto_微信小程序学习笔记(三)-- 首页及详情页开发

一、常用组件在上一个章节中讲解了封装请求数据的模块,在此处请求轮播图的数据1.首页轮播图数据的请求以及渲染1.1 轮播图数据的请求 pages/home/home.jsimport 2 使用组件 - 视图容器 - swiper滑块视图容器。其中只可放置swiper-item组件,否则会导致未定…

云计算与边缘计算协同 九大应用场景

来源:物联网报告中心前言2019 年边缘计算备受产业关注,一度引起了资本市场的投资热潮,很多人把2019 年称作边缘计算的元年。理性来看,造成如此火爆局势难免有一些炒作因素在推波助澜,毕竟边缘计算的概念存世也已多年。…