def timeit(argument):
    """
    检测函数运行时间的装饰器
    支持不传参数的写法：
        @timeit
        def func(): pass
    或者传入一个logger：
        @timeit(logger)
        def func(): pass
    空参情况下将会打印运行时间到控制台，传入logger则会通过logger处理。
    """
    if hasattr(argument, 'info'):
        def decorator(function):
            @wraps(function)
            def wrapper(*args, **kwargs):
                start_time = time.time()
                argument.info('function [%s] start at [%s]' % (function.__name__, now(obj=False, precise=True)))
                rst = function(*args, **kwargs)
                argument.info('function [%s] exit  at [%s]' % (function.__name__, now(obj=False, precise=True)))
                argument.info('function [%s] coast [%sms]' % (function.__name__, (time.time() - start_time) * 1000))
                return rst

            return wrapper

        return decorator
    if callable(argument):
        @wraps(argument)
        def wrapper(*args, **kwargs):
            start_time = time.time()
            print 'function [%s] start at [%s]' % (argument.__name__, now(obj=False, precise=True))
            rst = argument(*args, **kwargs)
            print 'function [%s] exit  at [%s]' % (argument.__name__, now(obj=False, precise=True))
            print 'function [%s] coast [%sms]' % (argument.__name__, (time.time() - start_time) * 1000)
            return rst

        return wrapper
    raise ValueError('argument error.')