四时宝库

程序员的知识宝库

Python高级技巧1:快速定位python程序耗时的两种方法

在日常编写代码时,经常会遇到程序不符合预期,占用了太大内存或者执行了太长时间。

很多新手对于这类问题往往不知道如何分析,这篇文章将带领大家如何排查程序耗时的问题。

引言

本文介绍两种常见的定位程序耗时的方法。本文主要分为以下几个部分:

1、 使用timeit模块分析简短代码片段的耗时

2、 使用cProfile模块对整个程序进行耗时分析

使用timeit模块分析简短代码片段的耗时

timeit的使用方法为:

该模块会多次运行对应的代码片段,从中查找最佳性能(默认为 5次)

例如,我们来看一下下面3种实现平方根的方法,哪种更耗时。

结果如下:

可以看出,第二种实现方式是最快的。但是,numpy不是做了特殊优化,应该是它最快吗?其实,numpy要在array数组上才是最快的。我们看下面的代码。

可以看出,对比前面的第二种方式,执行速度上快了35倍。

使用cProfile模块对整个程序进行耗时分析

timeit通常用于分析比较短的程序片段,如果需要分析一个比较长程序的耗时,应该如何处理呢?这种情况,就可以使用cProfile模块了。

程序运行耗时,通常可能有两个原因:一是函数内部运行耗时;二是函数运行次数过多,加起来耗费太长时间。

我们来举个例子,以下代码为hillclimb.py,是使用爬坡算法来找模型最优超参数的方法。

可以看出,这个程序相对较长,而且也挺复杂。我们使用下面的代码对这个程序做耗时分析。

以下是输出结果:

我们看到程序中的函数 objective() 运行了 101 次,耗时 4.89 秒。但这 4.89 秒主要花在调用次数上,而花在该函数内部的总时间仅为 0.001 秒。其他函数的耗时也可以类似这样看。

通常,如果一个程序很复杂,我们可能不想要分析整个程序的耗时,而只是想看这个程序里某些部分的函数情况,这种情况用cProfile也可以实现。如下所示,是对上面程序的某些行的代码做了性能分析。

需要注意的是,cProfile无法分析像Tensorflow这类的程序,因为tf在真正执行之前,只是构建计算图,因此代码真正的运行逻辑和普通程序不同。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接