赖勇浩(恋花蝶)的博客

坐观天下风云涌,笑拥美人言语懒。

赖勇浩ID:lanphaday
301321次访问,排名171好友121人,关注者130
网络游戏程序员,略懂python、C++;不太懂网络编程、数据库编程;不懂C语言、3D。
lanphaday的文章
原创 58 篇
翻译 14 篇
转载 12 篇
评论 562 篇
赖勇浩的公告
Google
最近评论
ark:囧.....没东西看.为了一个项目花了2天啃DIP.....第一个例子看下来的确需要毅力.不过倒是勾起了继续学Python的兴趣.本来准备用完就扔的................
lanphaday:试验一下是不是无法评论。
Joyfish:DIP是我看完 Python Tutorial 后的第二个Python教程,其实感觉还不错,可能和在这之前我有多年的C++ & Java基础有关,支持博主
ghostjava:不要人云亦云,一群跟屁虫!你看着好就是好,管别人说什么,我就是用DIP入门的,虽然我是SPSS的,没在实际中使用过python,我就觉得很棒,初学者和穷人都来用。入门后推荐看<ython核心编程>.
ideasky:此帖甚好.
文章分类
收藏
    相册
    编程语言
    TIOBE 流行度
    性能排名
    我创建的开源项目
    VisualPyTune
    我的其它博客
    程序员的小厨房
    过去的博客
    非技术博客
    友情链接
    CP(图形学)
    DarkSpy
    一刀
    丫头
    沈公,仙人也!
    超哥之奋起版
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Python 性能剖分工具收藏

    新一篇: 我也想做 MVB | 旧一篇: 从作弊到机器学习——足球AI概况

    Python 性能剖分工具

    眼看着项目即将完成,却被测试人员告知没有通过性能测试,这种情况在开发中屡见不鲜。接下来的工作就是加班加点地找出性能瓶颈,然后进行优化,再进行性能测试,如此这般周而复始直到通过性能测试。尽管丰富的工作经验有助于性能优化,但只有科学地应用工具才能在最短的时间内找出最佳优化粒度的瓶颈代码段,达到事半功倍的效果。

    profilecProfilehotshot

             Python 内置了丰富的性能优化工具来帮助我们定位性能瓶颈,如:profilecProfile hotshot。它们易于使用,而且有完备的支持文档可供参考。下面以最常用的 profile 模块为例来说明它们的使用方法,假定要剖分的脚本文件为 foo.py ,它的内容如下:

    def foo():

           sum = 0

           for i in range(100):

                  sum += i

           return sum

    if __name__ == "__main__":

           foo()

    foo.py 进行性能剖分的方法之一是修改 foo.py 里的 if 程序块,引入 profile 模块:

    if __name__ == "__main__":

           import profile

           profile.run("foo()")

    然后执行 foo.py 即可完成性能剖分,剖分结果将以文本报表的形式打印到标准输出。

             因为上述方法需要修改 foo.py 文件,所以我们通常更倾向于使用无需修改源文件的方法——就是在命令行中用应用 python –m 参数来执行 profile

    python –m profile foo.py

             除了可以使用 profile 模块外,还可以使用 cProfile 模块。cProfile C 语言实现,是剖分代价更低的剖分器,有和 profile 模块相同的接口,但只能用于2.5或以上版本。Python 另一个内置的剖分器是 hotshot,但是 hotshot 模块已经不再推荐使用,因为将来它可能会被移出标准库。

    pstats

             无论使用哪个剖分器,它的剖分数据都可以保存到二进制文件,如foo.prof。分析和查看剖分结果文件需要使用 pstats 模块,它极具伸缩性,可以输出形式多样的文本报表,是文本界面下不可或缺的工具。

             使用 pstats 分析剖分结果很简单,几行代码就可以了:

    import pstats

    p = pstats.Stats("foo.prof")

    p.sort_stats("time").print_stats()

    运行上述脚本将输出结果为按函数内部运行时间(不计调用子函数的时间)长短排序的报表。

             sort_stats() 方法是 pstats.Stats 最重要的方法之一,它用以对剖分数据进行排序。sort_stats() 接受一个字符串参数,这个字符串标识了排序的字段,常用的可选的参数及其意义如下:

    ‘ncalls’

    被调用次数

    ‘cumulative’

    函数运行的总时间

    ‘nfl’

    Name/file/line

    ‘time’

    函数内部运行时间(不计调用子函数的时间)

    除了 sort_stats() 外, pstats.Stats 还有 print_callees() print_callers() 方法用以输出指定函数所调用的函数和调用过指定函数的函数。

             除了编编程接口外,pstats 还提供了友好的命令行交互环境,在命令行执行 python –m pstats 就可以进入交互环境,在交互环境里可以使用 read/add 指令读入/加载剖分结果文件,stats 指令用以查看报表, callees callers 指令用以查看特定函数的被调用者和调用者。下图是 pstats 的截图,标识了它的基本使用方法:

     

    有问题不明白?请教Google大神吧!
    Google
     

    发表于 @ 2008年02月25日 21:57:00|评论(loading...)|编辑

    新一篇: 我也想做 MVB | 旧一篇: 从作弊到机器学习——足球AI概况

    评论

    #Googol 发表于2008-02-26 11:37:16  IP: 58.247.121.*
    受教了,谢谢。

    提个建议,那行蓝色背景能不能改一下?Firefox下不选中基本看不到写的是啥……
    2008-02-26 11:47:19作者回复
    谢谢提醒,已经改为蓝底白字。因为如果使用蓝底的话 word 会自动把黑字渲染成白字,所以就在发表的时候忽略了这一点。以后我会多多注意。<br />
    #sunny_river 发表于2008-02-28 17:29:56  IP: 10.164.147.*
    很好很强大!
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 赖勇浩