当前位置: 首页 > 面试题库 >

Python是否有堆栈/堆,并且如何管理内存?

尉迟雅昶
2023-03-14
问题内容

如何在Python中管理变量和内存?它有堆栈和堆吗?用于管理内存的算法是什么?有了这些知识,对于大量/数据处理的内存管理有什么建议吗?


问题答案:

如何在Python中管理变量和内存。

自动地!不,真的,您只是创建一个对象,Python虚拟机将处理所需的内存以及将其放置在内存布局中的位置。

它有堆栈和堆吗?用于管理内存的算法是什么?

当我们谈论CPython它时,使用 私有堆 来存储对象。从CPython C
API文档中

Python中的内存管理涉及一个包含所有Python对象和数据结构的私有堆。此私有堆的管理由Python内存管理器在内部确保。Python内存管理器具有不同的组件,这些组件处理各种动态存储管理方面的问题,例如共享,分段,预分配或缓存

内存回收主要通过 引用计数 来处理。也就是说,Python
VM保留一个内部日志,记录有多少引用引用了一个对象,并在没有更多引用引用该对象时自动对其进行垃圾回收。此外,还有一种机制可以通过检测对象的“孤岛”来中断循环引用(引用计数无法处理),这与尝试查找所有可到达对象的传统GC算法有些相反。

注意: 请记住,此信息是 CPython 特定的。其他Python实现,比如pypyiron pythonjython当谈到自己的实现细节和其他人可能来自彼此之间以及与CPython的不同。为了更好地理解它,
可能有助于理解Python的语义(语言)和底层实现之间的区别。

有了这些知识,对于大量/数据处理的内存管理有什么建议吗?

现在我不能说这个,但是我确定NumPy(用于数字运算的最受欢迎的python库)具有可以优雅地处理内存消耗的机制。

如果您想进一步了解Python的内部原理,请查看以下资源:

  • 逐步学习CPython(视频)
  • 关于Python虚拟机内部的演示
  • 本着真正的黑客精神,CPython Object Allocator源代码


 类似资料:
  • 我们Java开发人员有时会使用来确保我们为每个特定于线程的堆栈提供了1MB的空间。现在,我经常感到困惑,JVM从哪里借用了1MB,从堆或系统内存中借用,或者Java为线程分配任何特定的内存。你能帮我理解一下吗? 此外,我们是否有一个可视化(插件)运行时工具,可以以可理解的方式显示堆和堆栈的内容? 提前感谢。

  • 问题内容: 是局部变量,将其存储在堆或堆栈中的何处? 问题答案: 在堆上。每当您用来创建对象时,它都会在堆上分配。

  • 问题内容: 内核堆栈和用户堆栈有什么区别?为什么要使用内核堆栈?如果在ISR中声明了局部变量,它将存储在哪里?每个进程都有自己的内核堆栈吗?那么,进程如何在这两个堆栈之间进行协调? 问题答案: 内核堆栈和用户堆栈有什么区别? 简而言之,除了在内存中使用不同的位置(并因此为堆栈指针寄存器使用不同的值)之外,什么也没有,而且通常使用不同的内存访问保护。也就是说,在用户模式下执行时,即使映射了内核内存(

  • 我想了解SWIFT中的堆栈和堆中存储了什么。我有一个粗略的估计:你打印的所有东西和内存地址都不是值,那些存储在堆栈中,而打印出来的是值,那些在堆中,基本上是根据值和引用类型。我完全错了吗?另外,可以提供堆栈/堆的可视化表示吗?

  • 本文向大家介绍java 中堆内存和栈内存理解,包括了java 中堆内存和栈内存理解的使用技巧和注意事项,需要的朋友参考一下  Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存

  • 我试图了解分配给堆栈和堆的内存量。假设sizeof(char)=1字节,sizeof(void*)=4字节。给定以下代码: 我们被告知分配给堆的内存量是5个字节,我明白这确实是malloc(strlen(str2)=5)中的量。但是,我不明白的是分配给堆栈的内存量是如何达到18个字节的?我想如果他们给我们一个指针大小是4个字节的信息,那么我们有4个字节的指针str1和另外6个字节的数组str2(包