• python 元类型编程,实现方法级的时间性能记录(performanceCount)


    需求: 系统中的每个操作流程,需要打印所有被执行到的方法的耗时。

    实现原理,利用python的元类型编程,动态改变class的创建过程,拦截class的方法,加上自定义的耗时记录。把记录导出到csv文件里面,方便对数据进行删选和排序。

    具体代码实现:

    #-*- coding: UTF-8 -*-
    #-------------------------------------------------------------------------------
    # Name:        performanceCountMeta
    # Purpose:     记录每个方法的时间消耗,帮助程序员方便的查找系统的性能瓶颈
    #
    # Author:      ankier
    #
    # Created:     26-01-2013
    # Copyright:   (c) ankier 2013
    # Licence:     <your licence>
    #-------------------------------------------------------------------------------
    
    from types import FunctionType
    import time, datetime
    import csv
    
      
    pfile = file('E:\performanceCount.csv', 'ab')
    writer = csv.writer(pfile)
    writer.writerow(['Module', 'method', 'spend time', 'time Start', 'time End'])
    pfile.close()
    
    ##   @summary: wrap 方法,AOP实现,记录每个函数的执行时间
    def _RecordPerformance(func):
        def warp(*args):
            
            
            glos = func.func_globals
    
            model = glos['__name__']
            methodName = func.func_name     
            
            #Start time
            starTime = time.time()
            startStr = datetime.datetime.now().isoformat()
            
            result = func(*args)
            
            #End time
            endTime = time.time()
            endStr = datetime.datetime.now().isoformat()
            
            SpendTime = endTime - starTime
            
            row = [model, methodName, str(SpendTime), startStr,  endStr]        
            
            pfile = file('E:\performanceCount.csv', 'ab')
            writer = csv.writer(pfile)
            writer.writerow(row)
            pfile.close()
            
            return result
            
        return warp 
    
    ##    @summary: 性能计数器的元类型,动态修改类的创建过程,wrap 一些特定的方法。实现方法拦截,记录性能
    class PerformanceCountMeta(type):
        def __new__(cls, name, bases, dct):
            for name, value in dct.iteritems():
                if name not in ('__metaclass__', '__init__', '__module__') and \
                type(value) == FunctionType:
                    value = _RecordPerformance(value)
                dct[name] = value
            return type.__new__(cls, name, bases, dct)

    例子如何使用,

    ##    @summary: word host 窗口
    class WordHostWindow(wx.Window):
        __metaclass__ = PerformanceCountMeta
        def __init__(self, parent):
            wx.Window.__init__(self, parent)    

    运行结果:

  • 相关阅读:
    actionscript项目中自加载preloader实现
    as3 弹性跑道模型
    快速排序
    快捷键
    frameset和iframe--框架对象及元素标签对象
    Javascript的陷阱
    JS火狐与IE的差别
    JS运动框架
    面向对象与闭包的使用
    闭包
  • 原文地址:https://www.cnblogs.com/ankier/p/2878189.html
Copyright © 2020-2023  润新知