# coding:utf-8
"""
Created on 2015年8月20日

@author: likaiguo & chenruotian
Python 性能分析入门指南
http://segmentfault.com/a/1190000000616798
"""
import time
from utils.logger import clogger, Logger


class Timer(object):
    """时间计算器

     time_grain: 时间粒度 - 秒s/毫秒ms, 默认毫秒ms
     verbose_in: 进入Timer时是否输出msg_in
     verbose_out: 退出Timer时是否输出msg_out
     verbose: 退出Timer时是否输出msg
     msg_in: 进入Timer时需要输出的消息,不为空时才真正输出
     msg_out: 退出Timer时需要输出的消息,不为空时才真正输出
     msg: 退出Timer时需要输出的消息,和计时结果一起输出,不为空时才真正输出
    """

    def __init__(self, time_grain=u'ms',
                 verbose_in=True, verbose_out=True, verbose=True,
                 msg_in=u'', msg_out=u'', msg=u'', logfile=None):
        self.time_grain = time_grain
        self.verbose_in = verbose_in
        self.verbose_out = verbose_out
        self.verbose = verbose
        self.msg_in = msg_in
        self.msg_out = msg_out
        self.msg = msg
        if logfile:
            self.logger = Logger('flogger', log2console=False, log2file=True,
                                 logfile=logfile).get_logger()
        else:
            self.logger = clogger

    def __enter__(self):
        if self.verbose_in and self.msg_in:
            self.logger.info('%s' % self.msg_in)
        self.start = time.time()

    def __exit__(self, *args):
        self.end = time.time()

        self.secs = self.end - self.start  # secs
        self.msecs = self.secs * 1000  # millisecs
        tm_str = ('%fs' % self.secs) if self.time_grain == u's' else (
            '%.3fms' % self.msecs)

        if self.verbose_out and self.msg_out:
            self.logger.info('%s' % self.msg_out)

        if self.verbose:
            if self.msg:
                self.logger.info('elapsed: %s, %s' % (tm_str, self.msg))
            else:
                self.logger.info('elapsed: %s' % tm_str)

if __name__ == '__main__':
    with Timer(msg_in=u'start test ...',
               msg_out=u'complete test',
               msg=u'test'
               ):
        from time import sleep
        sleep(1)
        print '1'
        sleep(1)
        print(2)

    # def primes(n):
    #     if n == 2:
    #         return [2]
    #     elif n < 2:
    #         return []
    #     s = range(3, n + 1, 2)
    #     mroot = n ** 0.5
    #     half = (n + 1) / 2 - 1
    #     i = 0
    #     m = 3
    #     while m <= mroot:
    #         if s[i]:
    #             j = (m * m - 3) / 2
    #             s[j] = 0
    #             while j < half:
    #                 s[j] = 0
    #                 j += m
    #         print m
    #         i = i + 1
    #         m = 2 * i + 3
    #     return [2] + [x for x in s if x]
    # print primes(100)