`
jeffreydan
  • 浏览: 27127 次
  • 性别: 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垃圾回收机制(GC)原理解析

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

    Python垃圾回收机制

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

    Python垃圾回收机制简介.pdf

    Python的垃圾回收机制是其内存管理的关键组成部分,它确保了程序在运行过程中有效且安全地管理内存。在Python中,由于一切都是对象,内存管理尤为重要,防止因无序分配和释放导致的内存泄漏或"out of memory"错误。...

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

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

    垃圾回收算法与实现

    - 保守式垃圾回收是针对无法得知程序中所有指针位置的情况设计的,它通过保守估计来决定哪些数据可能是指针,从而尽可能地回收垃圾。 - 分代垃圾回收是根据对象存活时间的不同将对象分成几代,年轻的对象在一次垃圾...

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

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

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

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

    Python的垃圾回收机制详解

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

    Python 垃圾分类查询

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

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

    Python中的垃圾回收机制主要包括引用计数、标记-清除和分代回收三种方式。 首先,引用计数是Python垃圾回收的主要方式,每个Python对象都会维护一个引用计数ob_refcnt,用来记录被引用的次数。当对象被创建时,引用...

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

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

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

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

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

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

    python分代回收.md

    在这个例子中,`a`和`b`互相引用,但通过调用`gc.collect()`可以强制执行垃圾回收,释放这些对象占用的内存。 #### 分代回收 ##### 1.3 分代回收的概念 分代回收是一种提高垃圾回收效率的策略,其基本思想是基于...

    著名的C_C++垃圾回收站.zip

    2. 并发回收:在多线程环境中,能够安全地进行垃圾回收,不会阻塞程序执行。 3. 分代垃圾回收:根据对象的生命周期将内存分为不同的区域,提高回收效率。 4. 可配置的策略:可能允许开发者根据应用需求调整垃圾回收...

    24GC实例:Python和Go的内存管理机制是怎样的?1

    在Python 3.4之后,还引入了分代垃圾回收(Generational GC),将对象分为年轻代和老年代,针对不同代的对象使用不同的垃圾回收策略,以提高效率。 接下来,我们转向Go语言。Go语言的内存管理机制与Python有很大...

    Python垃圾收集器原理研究及应用.pdf

    Python垃圾收集器是Python编程语言中的一个重要组成部分,它负责自动管理程序运行时的内存分配与回收,以确保程序不会因为内存耗尽而崩溃。本文由郭芬和刘明撰写,分别来自美博通通信技术和上海惠普公司,深入探讨了...

    Python高性能编程_python进阶_python高性能_源码.zip

    2. **内存管理**:Python的自动垃圾回收机制虽然方便,但在处理大规模数据时可能会成为性能瓶颈。理解如何有效管理内存,如使用生成器减少内存占用,避免创建大量临时对象,都是提高性能的关键。 3. **数据结构优化...

Global site tag (gtag.js) - Google Analytics