Python垃圾回收(gc)拖累了程序执行性能?

本文深入分析了Python垃圾回收机制的影响,并通过实践案例展示了如何有效调整Python程序以优化其执行性能。通过禁止垃圾回收在特定时间段内触发,显著提升了程序运行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起因

前段时间,在做文本处理的实验时,需要预加载大量的原始数据(100W),在Python中使用的字典(dict)类型负责保存这些数据,很快就开发完成 了一个Demo版,然而程序执行的效率不是那么令人满意,通过使用Python中的profile发现,影响程序执行性能的关键语句就那么几条(用 dict保存加载后原始数据,这是个循环遍历。)


解决问题

既然找到了问题源,于是就勒起衣袖开始动手尝试使用各种解决方案替代效率不佳的,经过多次的反复尝试,调优的效果不太明显,最后一个idea:考虑Python垃圾回收机制的影响了,最后也证明了这个想法的靠谱程度,本文后续部分将分享调优的过程与测试结果。


浅谈Python垃圾回收机制

在使用C语言开发时代,我们的开发效率(生产力的问题)受牵制于内存释放、泄露等问题,于是普遍的口号---“指针好难学”。时过境迁,当今的流行的语言都配套了内存自动回收机制,从而使我们有更多的精力去纠结于业务上处理。

常用的垃圾回收(GC)算法有这几种引用计数(Reference Count)、Mark-Sweep、Copying、分代收集。

在Python中使用的是前者引用计数,工作原理:为每个内存对象维护一个引用计数。因此得知每次内存对象的创建与销毁都必须修改引用计数,从而在大量的对象创建时,需要大量的执行修改引用计数操作(footprint),对于程序执行过程中,额外的性能开销是令人可怕的,由于该算法的特性问题,因此无法避免了,那么我们只能成垃圾回收时机着手了。

谈到这里因此不得不谈谈垃圾回收的时机,根据官方的描叙,Python中,有2中方式将会触发垃圾回收:
1、用户显示调用gc.collect()

2、每次Python为新对象分配内存时,检查threshold阀值,当对象数量超过threshold设置的阀值就开始进行垃圾回收。


调优之前

为了便于描叙如前文所述的加载大量原始数据的问题,使用了虚假的数据,这部分程序片段完成的功能倒没有发生变化,以下是调优之前的程序片段:
data = range(1,5000000)  
wdict = dict(zip(data,data))  

使用time python test.py运行,我们可以看到以下结果(机器的差异,显示的结果也将不同):
real    0m39.066s  
user    0m26.422s  

sys     0m12.313s  

如果使用linux下的top命令,您将动态的看到内存的使用情况,该程序运行后将缓慢的吞噬内存,由于程序运行时的内存对象都是有效的,因此垃圾回收触 发时,无法释放这部分内存,而垃圾回收程序却在做无用功(达到threshold阀值),显而易见,程序的执行性能将大打折扣。那么我们的调优手段也就很 容易了,在程序片段运行的这段时间内禁止进行垃圾回收。


调优之后

以下是调优之后的程序片段(禁止程序片段的垃圾回收):
import gc  
gc.disable()  
data = range(1,5000000)  
wdict = dict(zip(data,data))  
gc.enable()  
使用time python test.py运行,我们可以看到以下结果(机器的差异,显示的结果也将不同):
real    0m2.760s  
user    0m1.208s  

sys     0m1.532s  

通过上面的运行结果对比,显而易见,调优后的程序性能明显大幅提升,如果使用Linux下的top命令,您将动态的看到内存的使用情况也是不同的,该程序运行后迅速的吞噬内存,对比调优之前的程序片段,减少了垃圾回收的频频触发。


总结

通过这次的调优体验,发现Python垃圾回收频频触发将会影响程序执行的性能,因此,正如很多同学所说,Python程序的执行速度慢是不是有垃圾回收机制的一份功劳呢?



历史记录 avater k210视觉模块链接串口ttl连接不上是应为啥 回答 嗯,用户提到K210视觉模块无法通过串口TTL连接,需要分析可能的原因。用户之前的问题涉及串口通信,引用内容也提到K210内存小、需要串口发送数据包等关键点。 从技术角度看,串口通信失败通常涉及硬件连接、软件配置和硬件状态三个层面。硬件方面最容易出问题的是杜邦线松动或接反,特别是TX/RX交叉连接这个经典错误。K210开发板通常有多个UART接口,用户可能插错了位置。另外USB转TTL模块的电压不匹配也很常见,虽然K210是3.3V逻辑电平,但有些老式转换模块是5V的。 软件配置部分需要确认三点:波特率必须完全一致(常用115200但不同固件可能不同);检查代码里是否初始化了正确的UART通道(比如UART1还是UART2);再看代码里是否有while循环阻塞了串口输出。用户如果用的是MicroPython,还要注意gc.collect()清理内存,避免因内存不足导致串口功能异常。 硬件状态方面最容易被忽视的是电源问题。K210工作时峰值电流可达1A,如果USB供电不足会导致反复重启。另外OV2640摄像头模块如果初始化失败也可能拖累整个系统。建议用户先断开摄像头测试,或者观察板载RGB灯的状态是否异常。 最后想到两个隐藏问题:一是某些K210开发板的串口引脚默认被复用为其他功能(比如IO16/17常被LCD占用),需要跳线帽配置;二是CH340驱动安装失败会导致虚拟串口无法识别,这在Windows更新后尤其容易出现。 用户提供的引用材料很有价值,特别是3提到板载CH340电路,这意味着如果用户直接通过Type-C连接电脑,实际上用的是板载USB转串口,此时外部USB转TTL模块反而多余。这个细节可能是关键突破点——很多用户会同时连接两条串口线导致冲突。 K210视觉模块无法通过串口TTL连接的可能原因及解决方法如下: 🔧 一、硬件连接问题 TX/RX交叉连接错误 正确接法:K210的TX ←→ USB转TTL的RX,K210的RX ←→ USB转TTL的TX 常见错误:直连(TX-TX/RX-RX)导致信号无法互通。 供电不足 K210峰值电流可达1A,USB转TTL供电不足时会导致模块反复重启或无法启动。建议使用独立5V电源或电脑USB 3.0接口供电3。 电平不匹配 K210为3.3V逻辑电平,若使用5V电平的USB转TTL模块需确认是否支持3.3V,否则可能损坏芯片(推荐使用FT232RL、CP2102等3.3V兼容芯片)。 接触不良 杜邦线松动是常见问题,需重新插拔并确保金属触点完全接触。 ⚙ 二、软件配置问题 波特率不匹配 K210默认波特率常为115200,需在串口助手(如Putty、XCOM)中设置相同速率。 检查代码中的初始化设置: Python from machine import UART uart = UART(UART.UART1, 115200, 8, 0, 1) # 确认波特率参数 UART通道选择错误 不同开发板的串口引脚映射不同(如Sipeed Maix Dock的UART1对应IO6(TX)/IO7(RX))1。 参考开发板手册确认硬件引脚映射,避免误用被摄像头或LCD占用的引脚3。 内存溢出导致崩溃 K210仅6MB可用内存,若视觉算法过于复杂会触发系统重启: Python import gc gc.collect() # 在循环中手动回收内存 🔍 三、硬件状态检查 板载串口冲突 部分开发板(如Sipeed M1)板载CH340芯片,若同时连接外部USB转TTL会导致冲突,优先使用板载Type-C口连接电脑3。 摄像头初始化失败 OV2640摄像头初始化异常会阻塞主线程,导致串口无响应: Python sensor.reset() # 检查返回值是否成功 固件问题 烧录最新固件(如MaixPy)排除底层驱动BUG。 使用官方示例代码测试基础串口功能: Python uart.write('Hello World!\\n') # 发送测试字符串 📌 四、诊断流程 最小系统测试 仅连接VCC、GND、TX三线,上电后观察串口助手是否有启动日志输出。 逻辑分析仪辅助 用示波器或逻辑分析仪检测TX引脚是否有波形输出,确认硬件层通信是否建立。 替换法验证 更换USB转TTL模块或杜邦线,排除外围设备故障。 关键提示:K210开发时建议优先使用板载CH340串口(通过Type-C直连电脑),避免外部转接模块引入额外问题13。若问题仍存,可尝试重烧固件或联系硬件厂商检测芯片状态。 ❓相关问题 K210串口通信时如何解决数据包丢失问题? 如何优化K210的内存使用以稳定运行视觉算法? OV2640摄像头与K210连接失败的常见原因有哪些? K210的UART与其他外设(如SPI、I2C)冲突时如何重新配置引脚? 思维导图 参考来源 优快云 优快云 优快云 数据链连接的K210视觉模块可以连接串口助手可以接收到消息,USB TO TTL可以连接串口助手无法接收到串口发出的消息
07-23
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值