群里有个人问我最近怎么不活跃了。 问我这话的人,一看就知道工作不饱和。 话说最近有些忙,走了个小弟, 然后各种开发迭代在后面排着,这堆任务够我跟小弟忙一段时间了。 公司缺高级水平的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