技巧篇之装饰器

基于上次花式编程time_all函数出现大量重复操作,此处引入装饰器来说明代码的简洁性。装饰器作为Python中的黑魔法,可以使代码更加简洁优雅,常用于检查变量合法性,日志记录等操作。装饰器会在以后详细讲解,此处请自行查阅资料。

def time_it(text):
    def inner(func):
        def _wrapper(*args, **kwargs):
            t1 = time()
            ret = func(*args, **kwargs)
            t2 = time()
            print(text, t2 - t1)
            return ret
        return _wrapper
    return inner

装饰在每个函数上

@time_it("循环法用时:")  # 装饰在函数上方即可
def fib2(n):
    """
    指定生成n个菲波拉契数
    """
    ret = []
    a, b = 0, 1
    for i in range(n):
        ret.append(b)
        a, b = b, a + b
    return ret

@time_it("生成器法用时:")
def fib4(n):
    """生成器"""
    a, b = 0, 1
    for i in range(n):
        yield b
        a, b = b, a + b

@time_it("矩阵法用时:")
def fib5(n):
    """矩阵法"""
    ret = []
    m = np.matrix([[1, 1], [1, 0]])
    for i in range(n):
        ret.append((m ** i)[0, 0])
    return ret
    
if __name__ == '__main__':
    num = 10000 # 主函数直接调用
    fib2(num) # 主函数这里还有重复调用,进一步优化
    fib4(num)
    fib5(num)
# 结果:
循环法用时: 0.007998943328857422
生成器法用时: 3.814697265625e-06
矩阵法用时: 0.4287300109863281

主函数这里还有重复调用,对于重复的操作需要进一步优化,此处引入高阶函数map, 和匿名函数lambda,主函数优化为:

if __name__ == '__main__':
    num = 10000
    funcs = [fib2, fib4, fib5] # 存放调用函数
    for _ in map(lambda f: f(num), funcs): pass
# 结果:
循环法用时: 0.0052640438079833984
生成器法用时: 2.1457672119140625e-06
矩阵法用时: 0.3924410343170166

这样优化的好处是funcs列表可以增加调用函数个数,而不需要修改其余代码:

if __name__ == '__main__':
    num = 10000
    funcs = [fib2, fib5, fib4, fib4, fib5] # 增加函数调用
    for _ in map(lambda f: f(num), funcs): pass
# 结果:
循环法用时: 0.006803989410400391
矩阵法用时: 0.38605594635009766
生成器法用时: 9.5367431640625e-07
生成器法用时: 9.5367431640625e-07
矩阵法用时: 0.4611539840698242

注意:对于不懂的知识点,请自行百度,以便于提高自学能力

总结

本文基于上次花式编程的time_all函数做了优化,优化的目的使得代码更加优雅,便于阅读和管理。引入装饰器是为了说明编程存在很多技巧。以后会详细介绍,感谢各位阅读。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一同学的离婚手续终于办到了最后一步,我们对这个结果已经盼望了很久。 她老公也是她小学同学,出轨已久,她未怀孕起,她...
    静夜语思阅读 2,498评论 0 0
  • (一) 在每个心怀梦想的商业人起步的时候,除了资源能力等等的客观差异,最为主观的差异就只有初心。 常听说,不忘初心...
    黑客咖啡屋阅读 2,312评论 0 0
  • 本文具有强烈的个人感情色彩,如有观看不适,请尽快关闭. 本文仅作为个人学习记录使用,也欢迎在许可协议范围内转载或使...
    魔鬼产品人阅读 3,674评论 0 1
  • 处女座,听起来是一个不得了怕死人的星座,仿佛大家一致的印象都是爱计较、强迫症……但是,这些远远不能形容这一神奇物种...
    huijam413阅读 3,233评论 0 0