`
jeffreydan
  • 浏览: 27221 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

起因

前段时间,在做文本处理的实验时,需要预加载大量的原始数据(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程序的执行速度慢是不是有垃圾回收机制的一份功劳呢?

分享到:
评论
4 楼 jeffreydan 2011-05-14  
congdepeng 写道
写的很清楚 如果禁止垃圾回收 是否要考虑堆栈溢出的情况?会不会出现在禁止垃圾回收的这一段语句运行期,占用完了本进程所申请的堆栈内存?python会自动扩充默认堆栈内存吗?


在Python中一切都是对象,除了类型对象是静态初始化,其余的对象都是在堆上分配内存,因此不会出现您说的堆栈溢出。这种方案是空间换时间。
3 楼 wmjie 2011-05-13  
感谢分享,现在的机器内存很大的说,用空间换时间应该很划算 :-)
2 楼 wenjinglian 2011-05-11  
congdepeng 写道
写的很清楚 如果禁止垃圾回收 是否要考虑堆栈溢出的情况?会不会出现在禁止垃圾回收的这一段语句运行期,占用完了本进程所申请的堆栈内存?python会自动扩充默认堆栈内存吗?

写得不错,这个确实要考虑
1 楼 congdepeng 2011-05-03  
写的很清楚 如果禁止垃圾回收 是否要考虑堆栈溢出的情况?会不会出现在禁止垃圾回收的这一段语句运行期,占用完了本进程所申请的堆栈内存?python会自动扩充默认堆栈内存吗?

相关推荐

    浅析Python垃圾回收机制.pdf

    Python垃圾回收机制是指在Python程序执行过程中,动态申请内存空间,并在不再需要使用这些内存空间时释放它们,以避免内存泄漏。Python中的垃圾回收机制主要以引用计数为主,标记清除和分代回收为辅,同时还有缓存...

    python基础知识(包括程序执行原理,算术运算符,变量的使用等)

    python基础知识(包括程序执行原理,算术运算符,变量的使用等) python基础知识(包括程序执行原理,算术运算符,变量的使用等) python基础知识(包括程序执行原理,算术运算符,变量的使用等) python基础知识...

    python垃圾回收机制(GC)原理解析

    这篇文章主要介绍了python垃圾回收机制(GC)原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下  今天想跟大家分享的是关于python的垃圾回收机制,虽然本人...

    Python垃圾回收机制

    Python的垃圾回收(Garbage Collection,简称GC)机制是其内存管理的重要组成部分,它自动管理程序中的内存分配和释放,避免内存泄漏。Python中的数据类型,如数值和字符串,由于它们的不可变性,每次赋值操作都会...

    垃圾回收GC经典算法(csdn)————程序.pdf

    垃圾回收(GC,Garbage Collection)是编程语言中用于自动管理内存的重要机制,尤其是在像Java、Python这样的语言中。GC的主要任务是识别并回收不再使用的内存块,避免内存泄漏,保持系统的高效运行。 1. 什么是...

    Python垃圾回收机制三种实现方法

    Python垃圾回收机制是编程语言中用于自动管理内存的重要特性,它负责识别并释放不再使用的对象,从而避免内存泄漏。在Python中,有三种主要的垃圾回收实现方法:引用计数、标记清除和分代回收。 **引用计数**是最...

    gc.tar.gz_garbage_garbage collection_回收站_垃圾回收

    在IT行业中,垃圾回收(Garbage Collection,简称GC)是一项重要的技术,特别是在使用像Java、Python、Ruby等高级编程语言时。垃圾回收是自动管理内存的一种机制,它负责监测和释放不再使用的内存空间,以防止内存...

    Python高性能编程_python进阶_python高性能_

    本教程专注于提升Python程序的性能,通过深入理解Python的基本元素,我们可以优化代码,使其运行得更快、更有效率。以下是一些关键的知识点,涵盖了Python进阶和高性能编程的核心概念。 1. **内存管理**:Python的...

    Python的垃圾回收机制详解

    Python作为一门广泛使用的高级编程语言,其内置的垃圾回收机制对于管理内存...开发者在编写Python程序时,尽管通常不需要直接关注垃圾回收器的细节,但理解其工作原理对于编写高效的程序和处理内存问题时是非常有益的。

    Python 垃圾分类查询

    Python做的垃圾分类查询,基于网站 "https://lajifenleiapp.com/"做的一个软件,能快速分类垃圾

    如何快速理解python的垃圾回收机制

    Python的垃圾回收机制是编程语言中自动管理内存的重要机制,它的设计目的是为了高效地回收不再使用的内存空间,防止内存泄漏,从而确保程序的稳定运行。本文将深入探讨Python垃圾回收的原理、问题及其解决方案。 ...

    Python库 | gc-overrides-0.1.0.tar.gz

    1. **垃圾收集接口**:gc模块提供了与Python垃圾收集器交互的接口,例如`gc.enable()`、`gc.disable()`用于启用和禁用垃圾收集,`gc.collect()`用于强制执行垃圾收集。gc-overrides库可能扩展了这些接口,提供更灵活...

    详细分析Python垃圾回收机制

    Python垃圾回收机制是Python编程语言中的一个重要特性,它自动管理程序的内存使用,避免程序员手动进行繁琐且可能出错的内存释放操作。Python中的垃圾回收(GC)主要由三种策略组成:引用计数、标记-清除和分代回收...

    Python开发垃圾分类查询系统完整项目流程实战_编程案例实例详解课程教程.pdf

    在本篇《Python开发垃圾分类查询系统完整项目流程实战》中,我们将探讨如何使用Python编程语言构建一个实用的垃圾分类查询系统。这个系统可以帮助用户查询不同类型的垃圾应该如何分类,从而适应日益严格的环保政策。...

    Python-PySpyPython程序采样可视化性能分析工具

    然后,你可以使用`py-spy record`命令来记录并分析一个Python程序的执行过程,或者使用`py-spy top`命令实时查看正在运行的Python进程的性能数据。 例如,如果你有一个名为`my_script.py`的Python程序,你可以这样...

    【ASP.NET编程知识】.Net的GC垃圾回收原理及实现.docx

    在此,可使用 GC.Collect 方法强制执行垃圾回收,从而诱导垃圾回收。注意,是诱导,而不是即刻回收。为了考虑到应用程序当前的稳定运行,执行 GC.Collect并不一定马上产生效果,这里仅仅是一个触发,会去收集将要...

    python的内存管理和垃圾回收机制详解

    1. **手动垃圾回收**:虽然Python提供了自动垃圾回收机制,但在某些情况下,可以通过调用`gc.collect()`函数手动触发垃圾回收,以优化程序性能。 2. **避免循环引用**:使用弱引用(通过`weakref`模块)或显式解除...

Global site tag (gtag.js) - Google Analytics