Python内存管理机制深度剖析(面试官最爱问的底层原理)

第一章:Python内存管理机制深度剖析(面试官最爱问的底层原理)

对象与引用:一切皆对象的内存视角

Python 中所有数据类型都是对象,每个对象在堆内存中分配空间,并包含类型信息、引用计数和实际值。变量本质上是指向对象的引用,而非存储值本身。 例如:
# 变量 a 和 b 指向同一个整数对象
a = 100
b = a
print(id(a) == id(b))  # 输出 True,说明是同一对象
当多个变量引用同一不可变对象时,Python 会复用对象以节省内存,这是由于小整数缓存和字符串驻留机制所致。

引用计数与垃圾回收机制

Python 主要通过引用计数追踪对象生命周期。每当有新引用指向对象,计数加一;引用被删除或重新赋值,计数减一。计数为零时立即释放内存。 引用计数的局限在于无法处理循环引用。为此,Python 引入了“标记-清除”和“分代回收”机制,由 gc 模块管理。 可通过以下方式查看引用计数:
import sys
a = []
print(sys.getrefcount(a))  # 输出 2:a 和 getrefcount 参数各持一引用

内存池与小对象分配器

为提高效率,Python 使用内存池系统管理小对象(小于512字节)。该系统分为多个层级:
  • Block:固定大小的内存块,用于存放同类对象
  • Pool:由多个 block 组成,按需分配
  • Arena:大块内存,包含多个 pool
此机制显著减少频繁调用系统 malloc 的开销,尤其在大量创建短生命周期对象时表现优异。
机制作用触发条件
引用计数实时释放无引用对象引用增减
标记清除处理循环引用代阈值达到
分代回收优化GC频率对象存活代数提升

第二章:内存管理核心概念与对象模型

2.1 引用计数机制及其在对象生命周期中的作用

引用计数是一种简单而高效的内存管理机制,通过追踪指向对象的引用数量来决定其生命周期。当引用计数归零时,系统立即释放该对象,从而实现及时的资源回收。
引用计数的工作原理
每个对象维护一个计数器,记录当前有多少变量引用它。每当有新引用指向该对象,计数加一;引用移除或重新赋值时,计数减一。
type Object struct {
    data string
    refCount int
}

func (o *Object) IncRef() {
    o.refCount++
}

func (o *Object) DecRef() {
    o.refCount--
    if o.refCount == 0 {
        fmt.Println("对象已释放")
        // 实际释放内存
    }
}
上述代码模拟了引用计数的核心逻辑:IncRef 增加引用,DecRef 减少并判断是否释放。该机制适用于大多数实时性要求高的场景,但需注意循环引用问题。
引用计数的优缺点对比
  • 优点:内存释放即时,延迟低
  • 缺点:无法处理循环引用,增加额外存储和操作开销

2.2 垃圾回收机制:分代回收与循环引用的检测原理

Python 的垃圾回收机制主要依赖于**引用计数**、**分代回收**和**循环引用检测**三者协同工作。对象的生命周期管理首先通过引用计数实时追踪,一旦引用数归零即刻回收。
分代回收策略
根据对象存活时间将其划分为三代(0, 1, 2),新生代对象经历多次回收仍存活则晋升。GC 频繁检查第0代,较少扫描高代,提升效率。
# 触发手动垃圾回收
import gc
gc.collect()  # 扫描并清理不可达对象
该代码强制执行完整垃圾回收,适用于怀疑存在循环引用时的主动清理。
循环引用的检测机制
引用计数无法处理相互引用导致的内存泄漏。Python 使用“标记-清除”算法在分代回收中识别并打破循环。
代数012
触发阈值7001010
当某代新增对象数超过阈值,便触发对应代及更老代的回收流程。

2.3 Python小整数池与字符串驻留技术的底层实现

Python在底层通过对象缓存机制优化内存使用和比较效率,其中最具代表性的便是小整数池和字符串驻留技术。
小整数池机制
CPython解释器启动时,会预先创建-5到256范围内的整数对象并缓存。后续对这些整数的引用将直接复用已有对象,提升性能。
a = 100
b = 100
print(a is b)  # 输出 True,因指向同一对象
该机制通过PyLongObject的静态数组实现,避免频繁创建小整数对象。
字符串驻留(String Interning)
Python自动或手动将相同值的字符串指向同一内存地址。常量折叠、标识符等场景默认驻留。
s1 = "hello"
s2 = "hello"
print(s1 is s2)  # 通常为 True
可通过sys.intern()强制驻留,减少重复字符串内存占用。
机制作用范围目的
小整数池-5 ~ 256加速整数访问
字符串驻留常量/标识符节省内存与提升比较速度

2.4 内存池机制与PyMalloc在性能优化中的应用

Python 在底层通过内存池机制管理小对象的内存分配,显著提升频繁分配与释放场景下的性能表现。核心实现位于 PyMalloc,专为小于 512 字节的对象提供快速内存分配路径。
内存池层级结构
  • arena:最大单位,通常为 256KB,由操作系统分配
  • pool:每个 arena 被划分为多个 4KB 的 pool,按大小分类管理
  • block:每个 pool 管理固定大小的 block,如 8B、16B 等
PyMalloc 分配示例

// 简化版 PyMalloc 分配逻辑
PyObject* PyObject_Malloc(size_t nbytes) {
    if (nbytes > 512) {
        return malloc(nbytes); // 超出阈值则交由系统
    }
    pool = get_free_pool_for_size(nbytes);
    block = allocate_block_from_pool(pool, nbytes);
    return block;
}
该机制避免了频繁调用系统 malloc,减少内存碎片。对于短生命周期的小对象(如整数、字符串),复用 block 显著降低开销。
性能对比
分配方式平均延迟 (ns)碎片率
系统 malloc8523%
PyMalloc127%

2.5 对象析构过程与__del__方法的使用陷阱

Python中的对象析构由垃圾回收机制自动触发,当对象引用计数降为0时,`__del__`方法会被调用。然而,过度依赖`__del__`可能导致资源释放延迟或未执行。
__del__的典型误用场景

class FileHandler:
    def __init__(self, filename):
        self.file = open(filename, 'w')
    
    def __del__(self):
        self.file.close()
        print("文件已关闭")
上述代码看似合理,但若对象在解释器全局命名空间中(如模块级变量),其`__del__`可能在程序退出时才被调用,甚至不被调用。
推荐替代方案
  • 使用上下文管理器(with语句)确保资源及时释放
  • 显式调用关闭方法,避免依赖隐式析构

第三章:深入理解变量与内存分配行为

3.1 可变对象与不可变对象的内存共享与拷贝策略

在Go语言中,可变对象(如切片、映射)与不可变对象(如字符串、基本类型值)在内存管理上采用不同的共享与拷贝策略。理解这些机制有助于优化性能并避免数据竞争。
不可变对象的值拷贝
不可变对象在赋值或传参时进行值拷贝,每个变量持有独立副本。例如:

a := 5
b := a  // 值拷贝,互不影响
a = 10
fmt.Println(b) // 输出 5
该机制确保了数据隔离,适用于基础类型和小对象。
可变对象的引用共享
切片和映射等可变对象底层指向同一结构体,修改会影响所有引用:

s1 := []int{1, 2}
s2 := s1
s2[0] = 99
fmt.Println(s1) // 输出 [99 2]
此时 s1 与 s2 共享底层数组,需通过 copy() 显式深拷贝以避免副作用。
类型拷贝方式内存共享
int, string值拷贝否
[]T, map[T]T引用拷贝是

3.2 函数参数传递中的引用与值复制误区解析

在函数调用过程中,参数传递方式直接影响数据的可见性与可变性。开发者常混淆“值传递”与“引用传递”,尤其是在支持指针或引用类型的编程语言中。
值传递与引用传递的本质区别
值传递会复制实参的副本,形参修改不影响原始数据;而引用传递则传递变量地址,函数内操作直接影响原变量。
  • 值传递:适用于基本数据类型,安全但可能带来性能开销
  • 引用传递:适用于大型结构体或需修改原数据场景,高效但需谨慎管理副作用
典型代码示例分析
func modifyValue(x int) { x = 100 }
func modifyReference(x *int) { *x = 100 }

a := 10
modifyValue(a)     // a 仍为 10
modifyReference(&a) // a 变为 100
上述代码中,modifyValue 接收的是 a 的副本,修改仅作用于栈上局部变量;而 modifyReference 接收指针,通过解引用直接操作原始内存地址,实现跨作用域修改。

3.3 局部变量与全局变量的内存作用域与生命周期分析

在程序执行过程中,变量的内存分配与其作用域和生命周期密切相关。局部变量定义在函数内部,其作用域仅限于该函数块内,存储于栈区,函数调用结束时自动释放。
内存分布与变量生存周期
全局变量在程序启动时分配于数据段,生命周期贯穿整个运行过程;而局部变量随函数调用创建,退出销毁。
代码示例:作用域差异

#include <stdio.h>
int global = 10;        // 全局变量,数据段
void func() {
    int local = 20;     // 局部变量,栈区
    printf("%d, %d\n", global, local);
} // local 在此被销毁
上述代码中,global 可被所有函数访问,生命周期长;local 仅在 func() 内有效,调用结束后内存自动回收。
  • 局部变量:栈区分配,作用域受限,生命周期短
  • 全局变量:数据段存储,全局可访问,生命周期长

第四章:内存泄漏检测与性能调优实践

4.1 使用tracemalloc进行内存分配追踪与瓶颈定位

Python内置的`tracemalloc`模块能够追踪Python程序中的内存分配情况,帮助开发者精确定位内存瓶颈。
启用内存追踪
import tracemalloc

tracemalloc.start()  # 启动追踪
# ... 执行目标代码 ...
snapshot = tracemalloc.take_snapshot()
调用start()后,所有内存分配将被记录。通过take_snapshot()获取当前内存快照,用于后续分析。
分析内存使用分布
  • snapshot.statistics("lineno"):按行号统计内存分配
  • statistics[:5]:查看前5个最大内存消耗点
该方法可快速识别高内存开销的代码位置,尤其适用于长时间运行或批量处理任务。
定位内存泄漏源头
结合traceback信息,可追溯每一块内存的分配调用栈,有效识别未释放对象的根源,提升应用稳定性。

4.2 利用gc模块监控垃圾回收行为并优化触发时机

Python的`gc`模块提供了对内置垃圾回收机制的细粒度控制,可用于监控对象回收行为并调整触发策略以优化性能。
启用调试与监控
通过启用`gc.set_debug()`可捕获内存泄漏线索:
import gc

gc.set_debug(gc.DEBUG_STATS | gc.DEBUG_LEAK)
该配置输出每次回收的统计信息,并追踪未被释放的对象,帮助识别循环引用问题。
手动控制回收时机
在长时间运行的应用中,自动回收可能不及时。可通过`gc.collect()`手动触发:
collected = gc.collect()
print(f"回收了 {collected} 个对象")
结合代(generation)机制,优先检查新生代(第0代),提升效率。
调整回收阈值
使用`gc.get_threshold()`查看当前阈值(默认700,10,10),并通过`gc.set_threshold()`优化:
  • 提高阈值减少回收频率,降低CPU开销
  • 降低阈值适用于短时高对象创建场景

4.3 weakref弱引用在避免循环引用中的实战应用

在Python中,循环引用是导致内存泄漏的常见原因。当两个对象相互持有强引用时,即使不再使用,垃圾回收器也无法释放它们。`weakref`模块提供了一种非拥有式的引用方式,能够在不增加引用计数的前提下访问对象。
weakref的基本用法
import weakref

class Node:
    def __init__(self, value):
        self.value = value
        self._parent = None
        self.children = []

    def set_parent(self, parent):
        self._parent = weakref.ref(parent)  # 使用弱引用指向父节点

    def get_parent(self):
        return self._parent() if self._parent else None
上述代码中,通过weakref.ref()将父节点存储为弱引用,避免了父子节点间形成强循环引用。
应用场景:树形结构管理
在实现树结构时,子节点通常需要访问父节点,但不应阻止父节点被回收。使用弱引用可安全实现反向关联,确保内存资源高效释放。

4.4 高效使用生成器与上下文管理器减少内存占用

在处理大规模数据时,传统的列表构造方式容易导致内存溢出。生成器通过惰性求值机制,仅在需要时生成值,显著降低内存消耗。
生成器表达式 vs 列表推导式

# 列表推导式:一次性加载所有数据
large_list = [x * 2 for x in range(1000000)]

# 生成器表达式:按需生成,节省内存
large_gen = (x * 2 for x in range(1000000))
生成器不存储完整结果集,range(1000000) 的每个元素在迭代时动态计算,内存占用恒定。
结合上下文管理器安全操作资源
使用 with 语句可确保文件或网络连接及时释放:

with open('large_file.txt') as f:
    for line in f:
        process(line)
文件对象在块结束时自动关闭,避免资源泄漏,同时与生成器结合实现流式处理,极大提升效率。

第五章:总结与展望

技术演进中的架构选择
现代后端系统在高并发场景下面临着服务拆分与通信效率的权衡。以某电商平台为例,其订单服务从单体架构迁移至基于gRPC的微服务架构后,平均响应延迟下降40%。关键在于使用Protocol Buffers进行强类型定义,确保跨语言兼容性。

// 定义订单查询接口
service OrderService {
  rpc GetOrder(OrderRequest) returns (OrderResponse);
}

message OrderRequest {
  string order_id = 1;
}

message OrderResponse {
  string status = 1;
  double amount = 2;
}
可观测性的实践路径
分布式系统依赖完善的监控体系。以下为某金融系统采用的核心指标采集方案:
指标类型采集工具上报频率
请求延迟(P99)Prometheus + OpenTelemetry5s
错误率DataDog APM10s
消息积压数Kafka Lag Exporter30s
未来趋势的技术准备
  • 边缘计算推动服务轻量化,需优化容器镜像体积
  • AI驱动的日志分析逐步替代规则告警,提升异常检测精度
  • 服务网格(Service Mesh)将逐步统一南北向流量治理
[Client] → [Envoy Proxy] → [Authentication Filter] → [Backend Service]

相关推荐

Python协程的底层实现

生成器 协程的核心就是上下文切换,在Python中最简单的实现是用生成器 生成器有个方法 send() 可以从调用者向生成器函数发送数据,这样就可以在生成器中 yield future 表示要等待 future 的结果,然后把上下文切换到调用者,等 future 结果准备好后调用者再 send(future.result()) 给生成器发送结果,并把上下文切换到生成器函数 def gener...

El Psy Congroo 5800

Python 底层原理

1. 心得体会 最近在学习一些 python 底层原理的干货知识,从 python 底层的 C 代码真的是了解到了很多东西。让我明白了 python 是如何处理各种变量类型的,也明白了 python 是如何管理变量的。在这个过程中我也在学习过程中想通了以前遇到的一些当时认为很奇葩的现象,如 del 掉一个变量后新建一个变量偶尔会发现新建的变量和 del 的变量的地址是一样的,这本质上还是对 python 原理不清楚所导致的。 另外,我在学习中也参考了大佬的文章,感兴趣的可...

TorchCqs的博客 4142

SAP 公司间库存调拨通过IDOC完成自动发票校验

本文仅用于SAP软件的应用与学习,不代表SAP公司。(注:文中所示截图来源SAP ERP软件,软件相应著作权归SAP所有。公司间采购时,通过SAP内部EDI 数据传输功能, 由销售方开的公司间发票自动触发采购方的发票校验。​欢迎扫码加如下微信,我会把大家拉到SAP PP学习群,随时欢迎跟我和其他SAP PP顾问一起交流和学习,如下图库存调拨订单,系统已经完成了发货方发货和收货方收货。

2402_84262664的博客 926

python底层原理讲解_python底层原理

有同学问到了一个问题,python中存储变量是通过内存地址来存储,那么python又是如何去判断内存中的地址是什么数据类型的呢。经过查找,找到这篇文章:原博客地址:http://www.cnblogs.com/aashui/p/9871009.html1.Python是如何进行内存管理的?答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制一、对象的引用计数机制Python内部使...

weixin_42316079的博客 6348

闲鱼客户端三重动态签名机制解析:x-sign、x-mini-wua与x-umt

在移动客户端安全通信中,设备级动态签名已成为主流App防范自动化攻击的核心手段。其原理是将设备指纹、运行时行为与可信硬件标识深度融合,生成不可复用、不可跨端、不可静态伪造的请求凭证。这类机制超越传统Token或Session鉴权,具备强上下文绑定性与实时熵值校验能力,广泛应用于电商、社交及开放平台等高风险接口场景。技术价值体现在有效识别模拟器、无头浏览器与集群化爬虫,同时保障多端一致性与合规数据对接。本文聚焦闲鱼客户端实际落地的x-sign(带设备上下文的混合签名)、x-mini-wua(小程序行为水印)与

weixin_35732273的博客 500

深度解析中国支付清算体系

说起国之重器,不仅仅有 东风快递、渔16、渔17、渔18,还有另外一个国之重器-CNAPS2(中国支付清算体系)。 中国国内支付行业的发达水平、繁荣程度,不客气的讲,在全世界都是数一数二的,世界上最大的银行卡组织银联在中国,世界上交易量最大的网络零售支付清算体网联在中国。可以说现在我国经济的高速发展,离不开CNAPS2。

银行信息系统应用架构详解 2521

2020-12-02

#Python封装 class CLanguage : def setname(self, name): if len(name) < 3: raise ValueError(‘名称长度必须大于3!’) self.__name = name def getname(self): return self.__name #为 name 配置 setter 和 getter 方法 name = property(getname, setname) def setadd(self, add): if add.

weixin_45224503的博客 209

5分钟搞定微服务架构图:手把手教你用Draw.io画出专业级设计

本文详细介绍了如何使用Draw.io快速绘制专业级微服务架构图。通过5分钟入门教程,掌握核心组件拖拽、连接线优化等技巧,提升系统设计可视化效率。特别适合需要快速呈现分布式系统架构的开发团队,利用内置微服务元素和分层展示功能,轻松创建清晰易懂的技术文档。

pz890123的博客 1245

Python字典和列表底层实现原理

给字典添加一个值,key为hello,value为word# hash表初始如下hash_value = hash('hello') # 假设值为 12343543index = hash_value & ( len(enteies) - 1) # 假设index值计算后等于3# 下面会将值存在enteies中# 继续向字典中添加值hash_value = hash('color') # 假设值为 同样为12343543。

General_zy的博客 4944

Python爬虫实战:携程旅游攻略爬取全流程解析(动态接口+反爬破解+异步爬取)

本文介绍了携程旅游攻略的爬取全流程,涵盖静态和动态页面抓取、异步请求、高级反爬策略以及数据存储和简单分析。增加用户评论和评分抓取结合NLP分析攻略文本情感与关键词建立旅游推荐系统自动化代理IP池和验证码识别模块。

2201_76125261的博客 2039

Allegro孔和线被做到器件里面如何解锁操作指导

在做PCB设计的时候,会遇到孔和线被做到器件的情况,当需要移动器件的时候,孔和线也会跟着移动。孔和线被做到器件里面如何解锁操作指导。

weixin_54787054的博客 1146

Python字典底层实现原理

在Python中,字典是通过散列表或说哈希表实现的。字典也被称为关联数组,还称为哈希数组等。也就是说,字典也是一个数组,但数组的索引是键经过哈希函数处理后得到的散列值。哈希函数的目的是使键均匀地分布在数组中,并且可以在内存中以O(1)的时间复杂度进行寻址,从而实现快速查找和修改。哈希表中哈希函数的设计困难在于将数据均匀分布在哈希表中,从而尽量减少哈希碰撞和冲突。由于不同的键可能具有相同的哈希值,即...

answer3lin的博客 2万+

Kimi Code国产AI编程助手安装使用详细教程

Kimi Code 开发者智能编程服务简介:Kimi Code 是专为开发者提供的 AI 编程辅助工具,基于旗舰模型 Kimi K3(2.8万亿参数,支持100万token上下文)。提供 CLI、VS Code 插件等形式,支持代码阅读、编辑等功能。用户可通过API Key接入第三方工具。安装简单(Windows/Mac/Linux一键脚本),需在官网生成API密钥并登录使用。注意账户需充值余额方可正常调用服务。

猿小白的博客 2084

浅析 Python 的一些底层原理与 CPython

浅析 Python 的一些底层原理与 CPython

叶庭云 成为自己的光 3378

搭建问答系统

数据描述 import docx import jieba from gensim.models import Word2Vec import os import numpy as np import pickle as pk import warnings from copy import deepcopy warnings.filterwarnings("ignore") from mu...

微信号:RunsenLiu 1843

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Python:Python底层原理:Python的整数是如何实现的

Python 整数在底层是如何存储的

C++ JAVA的专栏 1423

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python编程:从机器原理到底层实现逻辑

本文系统介绍了Python从底层机器原理到高级特性的实现逻辑。第一部分讲解计算机体系结构基础、Python解释器层次结构和内存模型;第二部分剖析Python核心数据结构的底层实现,包括对象通用结构、整数、列表和字典;第三部分解析Python虚拟机与字节码执行机制;第四部分探讨生成器、装饰器等高级特性的实现原理;第五部分涉及性能优化与C扩展开发;第六部分分析Python并发模型,包括GIL、多进程和异步IO。全文揭示了Python简洁语法背后的复杂系统设计,帮助开发者深入理解Python运行机制,写出更高效的

胡茬大叔的博客 711

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Python内存管理深度剖析:程序员节必须掌握的底层原理

掌握Python内存管理核心原理,提升代码性能与效率。本python程序员节视频教程深入解析引用计数、垃圾回收机制及内存优化技巧,适用于高性能程序开发与调试场景。内容详实,原理与实战结合,值得收藏。

PixelFlow的博客 741

『Python底层原理』--CPython 虚拟机

当虚拟机执行代码对象时,帧对象负责记录变量的值、维护值栈(用于指令执行时的数据存储和操作),还会记录代码执行的位置(如当前行号、上一条执行的指令位置等),以便在函数调用、返回以及异常处理等情况下,能够正确恢复和继续执行代码。可以说,帧对象为代码对象的执行提供了一个动态的上下文环境,它随着代码的执行而创建和销毁,形成一个调用栈,反映了函数调用的层次结构。代码对象是 CPython 中存储代码块相关信息的结构,像模块、函数体这类作为独立执行单元的代码,其信息都保存在代码对象里。

weixin_55010563的博客 1186

2.10 Python继承的底层原理及MRO机制详解

Python的继承机制通过MRO(方法解析顺序)和super()函数实现了灵活的多重继承功能。MRO采用C3线性化算法,根据类定义时基类的声明顺序确定方法查找路径,确保子类优先、声明顺序一致的原则。super()并非简单调用父类,而是沿MRO链动态查找下一实现,使得多重继承中的方法调用具有可预测性。

分享产生双倍快乐 799

【python】python中字典的底层是怎么实现的

python字典的底层实现的是哈希表。调用python内置的哈希函数,将键(key)作为参数进行转换(哈希运算+取余运算),得到一个唯一的地址(地址的索引),然后将值(value)存放到对应的地址中(给相同的键赋值会直接覆盖原值,因为相同的键转换后的地址时一样的)哈希表(Hash Table,又称为散列表)是一种线性表的存储结构。由一个直接寻址表 T (假设大小为m) 和一个哈希函数 h(k) 组成。对于任意可哈希对象,通过哈希函数(一般先进行哈希计算,然后对结果进行取余运算),将该对象映射为寻址表的索引

python全栈 3282

Python底层逻辑详解

Python是一种解释型语言,这意味着Python代码在执行时并不需要事先通过编译生成机器代码,而是直接由Python解释器逐行解析和执行。通过继承,一个类可以继承另一个类的属性和方法,并可以在继承的基础上进行扩展和修改。通过多态,可以对不同类型的对象使用相同的方法名,实现代码的复用和灵活性。综上所述,Python的底层逻辑涉及解释器与字节码、内存管理机制、对象模型、类加载与执行以及性能优化与底层实现等多个方面。Python的类加载机制在运行时动态加载并解析类的定义,并将其转换为可执行的代码。

专业深耕,技术前沿 1309

深入解析:Python 的底层运行机制

例如,执行a = [1, 2, 3]时,列表对象[1, 2, 3]被创建,它的引用计数为 1,因为变量a引用了它。GIL 的存在主要是为了简化 CPython 的内存管理,因为 Python 的内存管理不是线程安全的,GIL 可以避免多个线程同时操作内存导致的问题。例如,执行del a后,如果没有其他变量引用列表对象,那么该对象的引用计数减为 1,当再执行del b时,引用计数变为 0,Python 会自动释放该列表对象占用的内存空间。二、Python 内存管理​。三、Python 线程处理​。

数字魔方操控师的博客 806

详解Python字典的底层原理——哈希表(Python面试必备)

详解Python字典的底层原理——哈希表(Python面试必备) Python面试经常会被问到: 你能说一说Python字典的底层实现原理吗? 这个问题可以从三个方面来回答: 1.python字典及其特性 字典是Python的一种可变、无序容器数据结构,它的元素以键值对的形式存在,键值唯一,它的特点搜索速度很快:数据量增加10000倍,搜索时间增加不到2倍;当数据量很大的时候,字典的搜索速度要比列表快成百上千倍1。 2.哈希表 Python字典的底层实现是哈希表。什么是哈希表,简单来说就是一张带索引和

weixin_47906106的博客 3565

说一道排序题

很经典的排序问题 (๑• . •๑)先看题目,“前K个高频元素”给定一个非空的整数数组,返回其中出现频率前k高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k...

崔斯特的博客 297

Python原理知识

Python原理知识Python比C、 C++执行效率低是多种原因交织在一起的原因。我觉得关键问题是 动态类型、解释执行、虚拟机、GIL这四个方面的问题:1、为了支持动态类型,Python对象加入了很多抽象,执行的时候要不断的判断数据类型,带来很大的开销,动态类型的动态检查开销,降低了运行速度2、python代码由解释器逐条解释执行(interactive model)或每次执行都要先翻译再运行,...

Coltea的博客 7879
上一篇: 高并发系统设计实战精要,2025架构师晋升必看的8个设计模式
下一篇: 从码农到架构师的跃迁密码:2025必备技能栈全图谱曝光
DebugLoom
博客等级 码龄1年 176粉丝 2107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值