分析 Python 脚本

本文的原文是:Profiling Python Scriptspython

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

此处输入图片的描述

分析器(Profiler)

基础用法很是简单。假设你有一个 myscript.py。使用 profiler 运行它,你须要作的是:app

$ python -m cProfile -o profile.out myscript.py <other-args>

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

Subprocesses

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

此处输入图片的描述

让咱们假设你的代码与此相似:学习

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个文件。spa

读取分析数据

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

$ 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。code

而后,就很简单了:

$ runsnake profile.out

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

此处输入图片的描述

来源

相关文章
相关标签/搜索