开源模块之python函数调用性能统计

群里有个人问我最近怎么不活跃了。 问我这话的人,一看就知道工作不饱和。  话说最近有些忙,走了个小弟, 然后各种开发迭代在后面排着,这堆任务够我跟小弟忙一段时间了。  公司缺高级水平的python程序员, 有兴趣的朋友可以跟我联系。 

该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新.   http://xiaorui.cc/?p=3503

正题开始:

    这两天调整了全网计算导数的系统,因为系统会跟各个rest api做交互,很多时候不确定在一个时间段内哪类函数,指令调用情况。也不往高大上的吹了,我就是个相当简单的查看函数调用统计信息,包括次数及平均的消耗时间。   我这人一般对于python程序的性能监控,会使用metrics模式来收集信息,但我人太懒了,又想要简单的python函数统计,又不想裁剪公司的python metrics模块。 这边的python metrics为了不影响系统性能做了很多复杂的事项,独立出一个线程,用匿名mmap来实现消息队列,监控数据是定时刷新到ElasticSearch里的。总是有些麻烦,我讨厌麻烦的东西。     

正好以前写过类似的性能数据展现的模块,这次翻弄出来,修一修,扔到了github中。

项目地址, https://github.com/rfyiamcool/func_stats


func_stats  使用表格方式显示函数调用统计, 实现的原理很简单就是通过inspect来打印函数调用栈信息,然后把当前的值扔到一个列表里,后期统计计算。  对于func_stats调用方法并没有使用装饰器来实现,而是创建pointer的来实现, 因为这样更加的方便使用. 这样最大的好处是不管在哪个上下文,你只要复用你定制的pointer就可以增加统计。


需要说明的是这项目本来就很简单,但他会依赖外部的prettytable.py表格模块,为了避免再pip install xxx,  索性直接把该模块引入到项目中. 

#xiaorui.cc
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time

from func_stats.func_stats import CreateStats
b = CreateStats()

b.point("once counter")

for i in range(1,5):
    b.point("loop counter")

b.point("t1 complated")

for i in range(10):
    b.point('sleep counter')
    time.sleep(0.1)

b.point("t1 complated")

b.display()

运行结果:

# xiaorui.cc

+---------------+------+------+----------+---------+---------+
| Point         | Line | count| Avg Time | Runtime | Percent |
+---------------+------+------+----------+---------+---------+
| once counter  |    8 |    1 |  0.00001 | 0.00001 |    0.00 |
| loop counter  |   11 |    4 |  0.00000 | 0.00001 |    0.00 |
| t1 complated  |   19 |    2 |  0.05046 | 0.10091 |    9.90 |
| sleep counter |   16 |   10 |  0.09184 | 0.91837 |   90.07 |
+---------------+------+------+----------+---------+---------+
Total runtime: 1.02

完事了, 这项目代码很简单,没什么好讲的,就是调用python inspect模块做调用栈输出。  另外打算再附加一个功能,针对被调用函数做个调用者的排名。  向下面这样…    

#xiaorui.cc

import inspect
def foo():
    who = inspect.getframeinfo(inspect.currentframe().f_back)[2]
    print '{} call me'.format(who)

def a():
    foo()

def b():
    foo()

a()
b()
a()

结果:

a call me
b call me
a call me



大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

发表评论

邮箱地址不会被公开。 必填项已用*标注