python程序运行速度随着时间不断变慢甚至崩溃

有一个NLP相关的代码放在实验室的服务器上跑的时候,刚开始非常快,几分钟可以跑70个例子,过了几小时后就明显变慢,甚至放在服务器上跑了一晚上,仍然只跑了几个,因此,肯定不是代码本身的功能或者例子本身的问题。
问了实验室的同学,应该是发生了内存泄漏
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。我的程序正好有大量的循环,因此也给不断累积的内存泄漏提供了条件。
如果是在服务器中,可以使用top命令查看一下运行中的程序的实时变化,非常明显的我就可以看到,在使用内存这一项上,我的程序初始运行时是2.9g,但是运行过程中会不断增长,如果过了几个小时看,所占的内存就是5.5g了,这个证据就明显的说明了我的程序发生了内存泄漏,无怪乎程序越来越慢。
那么为了解决这个问题,最主要的还是要定位程序中哪一个部分发生了泄露,才可以做出修改。
这里要使用到objgraph。
其中objgraph.show_growth()可以显示出代码执行过后增加的对象。

tuple 163411 +8749
list 4056757 +2709
dict 48076 +1665
Operation 5235 +429
_InputList 5235 +429
Tensor 5414 +423
TF_Output 4650 +372
Dimension 1528 +207
TensorShapeV1 988 +174
TraceableObject 3863 +120
这就是我每次循环过后增长的对象,可以看到内存泄漏的情况还是蛮严重的。

     objgraph.show_chain(objgraph.find_backref_chain(objgraph.by_type('list')[0],objgraph.is_proper_module),filename='list.dot' )

这句代码可以将程序中的引用关系找出来,生成一个dot文件来记录,使用graphviz软件可以绘制成图。

https://www.cnblogs.com/xybaby/p/7491656.html
这个博客有详细的介绍。

最后问题发现在一个神经网络相关的代码中,由于tensorflow的图是静态图,但是如果直接加载不同的图(即不同的模型),应该都会存在内存中,原有的图并不会释放,因此造成了测试速度越来越慢。
我的代码在每次循环时都会调用一次预测模型,可能是在这个过程中没有注意导致了内存泄漏。只要每次用完模型得到结果后

from keras import backend as K
K.clear_session()

就可以清除session。防止内存泄漏啦。之后运行,内存也基本稳定在3g左右了。

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
有几种方法可以提高 Python 程序的运行速度: 1. 使用更高效的算法和数据结构:选择合适的算法和数据结构可以显著提高程序的性能。例如,使用哈希表(字典)可以提高查找和插入操作的速度,使用集合可以速检查元素的存在性。 2. 减少循环次数:循环是程序中常见的性能瓶颈之一。尽量减少循环的次数,可以通过优化算法、使用向量化操作(如 NumPy)、使用列表推导式等方式来实现。 3. 使用适当的数据类型和库:选择适当的数据类型和库可以提高程序的效率。例如,对于数值计算,可以使用 NumPy 或者 Pandas 库,它们提供了高效的向量化操作和优化算法。 4. 避免不必要的内存分配:频繁的内存分配和释放会导致性能下降。尽量避免在循环或递归中频繁创建和销毁对象,可以通过复用对象或者使用生成器来减少内存分配。 5. 使用并发和并行处理:对于一些计算密集型任务,可以使用并发和并行处理来提高程序的运行速度Python 提供了多线程和多进程的模块,例如 threading、multiprocessing,以及对应的并发库,如 concurrent.futures 和 asyncio。 6. 使用 JIT(即时编译)技术:JIT 技术可以将 Python 代码转换为机器码,提高程序的执行速度。常用的 JIT 工具包括 Numba 和 PyPy。 7. 编写 C 扩展:对于特别需要高性能的部分,可以将其编写为 C 扩展,然后在 Python 中进行调用。这需要熟悉 C 语言和 Python/C API。 8. 使用缓存和优化技术:使用缓存可以避免重复计算相同的结果,从而提高程序的效率。另外,一些优化技术,如内联函数、循环展开、循环交换等,也可以优化代码的执行。 需要注意的是,优化程序的性能需要根据具体情况进行分析和优化,不同的应用场景可能存在不同的瓶颈。因此,在进行优化之前,建议先使用性能分析工具(如 cProfile)来确定瓶颈所在,然后有针对性地进行优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值