`
jeffreydan
  • 浏览: 26777 次
  • 性别: 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垃圾回收机制

    Python垃圾回收机制:主要介绍了计数引用,标记清除,分代回收等概念,测试代码,测试结果。用于技术学习,技术分享

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

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

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

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

    浅析Python垃圾回收机制.pdf

    浅析Python垃圾回收机制

    理解Python垃圾回收机制

    主要为大家详细介绍了Python垃圾回收机制,Python中的垃圾回收以引用计数为主,分代收集为辅,想要深入理解Python垃圾回收机制,请阅读下

    Python垃圾回收机制简介.pdf

    Python垃圾回收机制简介.pdf

    python+flask微信小程序订餐系统源码.zip

    python+flask微信小程序订餐系统源码 python+flask微信小程序订餐系统源码python+flask微信小程序订餐系统源码 python+flask微信小程序订餐系统源码python+flask微信小程序订餐系统源码 ...

    Python 垃圾分类查询

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

    python中的垃圾回收(GC)机制

    Python 垃圾回收以引用计数为主,分代回收为辅。引用计数法的原理是每个对象维护一个ob_refcnt,用来记录对象被引用的次数,也就是用来追踪有多少个引用指向了对象,当发生以下四种情况的时候,对象的引用计数+1: ...

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

    主要介绍了Python垃圾回收机制三种实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    智能垃圾分类Python程序

    做得不好仅供参考 菜鸟做得,没什么用,就分享一下把.................

    python分代回收.md

    python垃圾回收机制

    使用Python做垃圾分类的原理及实例代码附

    纸巾再湿也是干垃圾?瓜子皮再干也是湿垃圾??最近大家都被垃圾分类折磨的不行,傻傻的你是否拎得清?:loudly_crying_face::loudly_crying_face::loudly_crying_face:自2019.07.01开始,上海已率先实施垃圾分类制度...

    Python-PyInstaller将Python程序转换成独立的执行文件

    PyInstaller:将 Python 程序转换成独立的执行文件(跨平台)

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

    垃圾回收机制(简称GC)是Python解释器自带一种机,专门用来回收不可用的变量值所占用的内存空间 三、为什么要用垃圾回收机制呢? 程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话...

    详细分析Python垃圾回收机制

     Python中的垃圾回收机制简称(GC),我们在程序的运行中会产生大量的变量用于保存数据,而有时候有些变量已经没有用了就需要被清理释放掉该变量所占据的内存空间。在一些较为低级的语言中(比如:C语言,汇编语言...

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

    本案例就来编写一个查询垃圾分类的小程序。我们将会学习如何获取网页上的内容,并复习窗口设计的知识。 编程要点: 本案例的原理是通过编程模拟在网页中输入垃圾名称查询垃圾所属类别的过程,并获取网页上显示的查询...

Global site tag (gtag.js) - Google Analytics