资讯专栏INFORMATION COLUMN

分析 Python 脚本

qpwoeiru96 / 1646人阅读

摘要:本文的原文是我有一个负责一个长期运行任务的脚本。因为我想知道该脚本的大部分工作是在与哪个慢的外部系统进行通信。有一个非常好用的内建的分析器来回答这类问题。分析器基础用法非常简单。更好的解决方案是把数据到文件中然后使用来分析它。

  

本文的原文是:Profiling Python Scripts

我有一个负责一个长期运行任务的 Python 脚本。这个脚本同其他三个系统通信 - 它从系统 #1 和 #2 读取数据,合并它们然后再把它们推送到系统 #3。这是下面的描述。问题是迁移运行在我不满意的一个地方。因为我想知道该脚本的大部分工作是在与哪个慢的外部系统进行通信。Python 有一个非常好用的内建的分析器来回答这类问题。按照这篇文章来学习如何使用它。

分析器(Profiler)

基础用法非常简单。假设你有一个 myscript.py。使用 profiler 运行它,你需要做的是:

$ python -m cProfile -o profile.out myscript.py 

它将运行这个脚本并且 dump 这个 debug 数据到 profile.out。你也可以省略 -o profile.out 来让统计的 dumped 到脚本最后的 stdout。

Subprocesses

如果你的脚本使用了任何 subprocesses,事情就会变得有点复杂。以我来说,我对脚本的主流程不感兴趣 - 它所做的所有事情就是派生(spawn)一些 worker 子进程。我感兴趣的是在 worker 中发生了什么。

让我们假设你的代码与此类似:

import multiprocessing
import time

def worker(num):
    time.sleep(3)
    print "Worker:", num

if __name__ == "__main__":
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        p.start()

你需要引入另外一个间接层:

import multiprocessing
import cProfile
import time

def worker(num):
    time.sleep(3)
    print "Worker:", num

def profile_worker(num):
    cProfile.runctx("test(num)", globals(), locals(), "profile-%d.out" %num)


if __name__ == "__main__":
    for i in range(5):
        p = multiprocessing.Process(target=profile_worker, args=(i,))
        p.start()

就是这样。这个脚本运行之后,你将得到 profile-0.outprofile-4.out 这4个文件。

读取分析数据

如果你忽略 -o profile.out 这时将在 stdout 得到统计数据。这不是一个完美的解决方案。更好的解决方案是把数据 dump 到文件中然后使用 runsnake 来分析它。为了在 ubuntu 上安装它,你需要 wxpython 包,然后你才可以使用 easy-install 安装它。

$ sudo apt-get install python-wxgtk2.8 python-wxtools wx2.8-doc wx2.8-examples wx2.8-headers wx2.8-i18n
$ sudo easy-install SquareMap RunSnakeRun

由于某种原因我没有在 virtualenv 中运行工作。我需要一个全系统的 easy-install。有人抱怨缺失了 wx 模块。我的系统是 ubuntu 12.04。

然后,就很简单了:

$ runsnake profile.out

你在不同的函数获得了很好的统计分析,调用次数和累计时间。这些数据可以告诉你关于你 app 的很多东西。以我而言我获悉了与其中一个系统通信花费了 90% 的时间。从那里开始我可以优化它。

来源

http://stackoverflow.com/questions/582336/how-can-you-profile-a-python-script

http://stackoverflow.com/questions/11041683/python-multiprocess-profiling

http://www.vrplumber.com/programming/runsnakerun/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45357.html

相关文章

  • 调试和分析Python脚本

    摘要:调试器可帮助程序员分析完整的代码。我们将使用标准库中的模块调试我们的脚本。例外是程序执行期间发生的错误。设置断点并检查堆栈帧,并列出源代码。输入以继续调试。分析和计时程序分析程序意味着测量程序的执行时间。的模块用于分析程序。 showImg(https://segmentfault.com/img/remote/1460000018807029?w=902&h=442); 来源 | ...

    wenzi 评论0 收藏0
  • 说我菜?那好,我用Python制作电脑与手机游戏脚本来赢你

    摘要:我发现我的粉丝量涨的很慢,这次厚脸皮要波关注。这次做的是一个小巧的游戏脚本,本质上它可以用于任意的电脑与手机游戏。分析这个游戏是上的别猜百块儿,意思就是让咱们只踩黑块,然后会给我们弹一手音乐。越趋近于说明颜色越黑。 目录 前言 分析(x0) 分析(x1)         那么如何去确定这个像...

    PascalXie 评论0 收藏0
  • Python 性能分析入门指南

    摘要:内存泄漏往往发生在即使该对象不再使用的时候,你的程序还持有对该对象的引用。最快速发现内存泄漏的方式就是使用一个由编写的非常好的称为的工具。通过这些工具和技术的武装,你应该可以获取所有要求追踪大多数内存泄漏以及在程序快速识别瓶颈的信息。 注: 本文的原作者是 Huy Nguyen ,原文地址为 A guide to analyzing Python performance 虽然...

    TesterHome 评论0 收藏0
  • 收藏 | 10个可以快速用Python进行数据分析的小技巧

    摘要:函数将单元格内容以形式呈现。自动评论代码自动注释单元格中的选定行,再次命中组合将取消注释相同的代码行。如果需要恢复整个已删除的单元格,请按或撤消删除单元格。 showImg(https://segmentfault.com/img/remote/1460000019599210); 编译:小七、蒋宝尚 一些小提示和小技巧可能是非常有用的,特别是在编程领域。有时候使用一点点黑客技术,既可...

    silvertheo 评论0 收藏0
  • Python说简单真的简单,说难也难,就由过来人给你总结为什么吧。

    摘要:数据科学其实就是机器学习,数据分析和数据可视化。机器学习通过实现算法,该算法能够自动检测输入中的模式。一般应用于人脸识别语音识别热门机器学习算法包括神经网络深度学习支持向量机随机森林进行数据分析可视化进行数据可视化时,是非常热门的库。 ...

    HtmlCssJs 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<