Python性能优化-Profile

Why Profile

即使我们的代码已经非常Pythonic了,但运行效率还是不能满足要求。性能问题符合20/80规则,即20%的代码引起了80%的性能损耗。为了快速定位瓶颈代码,推荐通过Profile来分析,能到达事半功倍的效果。

Python Profile

对于Python,比较常用的Profile工具有三个:

  • profile 纯python语言实现,返回函数整体损耗。(自带)[详情]
  • cProfile 同profile,部分实现native化,返回函数整体损耗。(自带)
  • line_profile 返回函数每行损耗。(第三方)[详情]

Profile Usage

  • profile
# 这里使用vsm模型进行测试
from profile import Profile
p = Profile()
p.runcall(vsm, tags[0], tags[1])
p.print_stats()
 #  ncalls 函数总的调用次数
 #  tottime 函数内部(不包括子函数)的占用时间
 #  percall(第一个) tottime/ncalls
 #  cumtime 函数包括子函数所占用的时间
 #  percall(第二个)cumtime/ncalls
 #  filename:lineno(function)  文件:行号(函数)

   212 function calls in 0.002 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       78    0.000    0.000    0.000    0.000 :0(append)
       40    0.000    0.000    0.000    0.000 :0(count)
        2    0.000    0.000    0.000    0.000 :0(keys)
        3    0.000    0.000    0.000    0.000 :0(len)
       78    0.000    0.000    0.000    0.000 :0(pow)
        1    0.000    0.000    0.000    0.000 :0(range)
        1    0.001    0.001    0.001    0.001 :0(setprofile)
        1    0.000    0.000    0.000    0.000 :0(sqrt)
        1    0.000    0.000    0.002    0.002 profile:0(<function vsm at 0x000000000233A278>)
        0    0.000             0.000          profile:0(profiler)
        1    0.000    0.000    0.000    0.000 vsm.py:12(create_vocabulary)
        2    0.000    0.000    0.000    0.000 vsm.py:17(calc_tag_frequency)
        2    0.000    0.000    0.000    0.000 vsm.py:26(create_vector)
        1    0.000    0.000    0.001    0.001 vsm.py:38(calc_similar)
        1    0.000    0.000    0.001    0.001 vsm.py:52(vsm)
  • line_profile
# 这里使用vsm模型进行测试
from line_profiler import LineProfiler
lp = LineProfiler()
lp_vsm = lp(vsm)
lp_vsm(tags[0], tags[1])
lp.print_stats()
# Total Time:测试代码的总运行时间
# Line:代码行号 
# Hits:表示每行代码运行的次数 
# Time:每行代码运行的总时间 
# Per Hits:每行代码运行一次的时间 
# % Time:每行代码运行时间的百分比

Timer unit: 1e-07 s

Total time: 0.000219 s
File: vsm.py
Function: vsm at line 52

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    52                                           def vsm(tag_list1, tag_list2, debug=False):
    53         1         59.0     59.0      2.7      count = len(tag_list1) + len(tag_list2)
    54         1        123.0    123.0      5.6      vocabulary = create_vocabulary(tag_list1, tag_list2)
    55         1        677.0    677.0     30.9      vector1 = create_vector(calc_tag_frequency(tag_list1), vocabulary)
    56         1        530.0    530.0     24.2      vector2 = create_vector(calc_tag_frequency(tag_list2), vocabulary)
    57         1        777.0    777.0     35.5      similar = calc_similar(vector1, vector2, count)
    58         1         24.0     24.0      1.1      return similar

Profile GUI

虽然Profile的输出已经比较直观,但还是推荐保存profile结果,然后使用图形化工具从不同维度进行分析,更快地找出瓶颈代码。
常用的Profile图形化工具有:

QCacheGrind
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 姓名:唐来宾 学号:17101223417 转载http://mp.weixin.qq.com/s/S6BN8P4...
    ahbz_t阅读 1,207评论 0 1
  • 选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能...
    xzhren阅读 656评论 0 9
  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    伊森H阅读 2,971评论 0 15
  • 虽然运行速度慢是 Python 与生俱来的特点,大多数时候我们用 Python 就意味着放弃对性能的追求。但是,就...
    selfboot阅读 1,949评论 2 28
  • 一个小萝莉害死大蜀黍的故事, 似乎确实可以这样概括。 有人为里昂不平,原本他可以平平安安地度过一生,但女孩的出现让...
    点沙成画阅读 206评论 0 0