Yappi的使用

最近要在项目里加入profiler,选择了yappi。

import yappi
import greenlet
import functools
import re
import datetime

profiler = None
in_profile = False


class Profiler(object):
    def __init__(self):
        yappi.set_clock_type("cpu")
        yappi.set_context_id_callback(lambda: id(greenlet.getcurrent()))
        yappi.set_context_name_callback(
            lambda: greenlet.getcurrent().__class__.__name__
            )

    def __call__(self, func):
        @functools.wraps(func)
        def wrapper(*args, **kwds):
            try:
                yappi.clear_stats()
                yappi.start(builtins=True, profile_threads=False)
                return func(*args, **kwds)
            finally:
                yappi.stop()
                stats = yappi.convert2pstats(yappi.get_func_stats())
                outFile = \
                    '_'.join(re.split('-|:|\.| ', str(datetime.datetime.now())))
                stats.dump_stats(
                    '/tmp/profile_{}_{}'.format(func.__name__, outFile))
                stats.sort_stats("cumulative")
                stats.print_stats()
                stats.sort_stats("tottime")
                stats.print_stats()
        return wrapper


def get_profiler():
    global profiler
    if profiler is None:
        profiler = Profiler()
    return profiler


def set_profile():
    global in_profile
    in_profile = True


def is_in_profile():
    return in_profile

在使用的可以使用get_profiler()这个函数来获得一个装饰器,把这个装饰器放到你要profile的函数上面,就可以对这个函数进行CPU耗时的profile啦。

这个装饰器在做profile的时候不光会在屏幕上打印一些profile的数据,还会以pstats的格式将这些profile写入/tmp/profile_xxx的一些文件中,注意,每个函数都是一个文件哦。你可以根据自己的需要来对这些功能进行取舍,或者改动出你自己的版本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值