代码之家  ›  专栏  ›  技术社区  ›  jxie0755

运行时检查功能

  •  1
  • jxie0755  · 技术社区  · 7 年前

    例如,如果我有一个带递归的fibonacci函数

    def fib_gen_r(i):
        """
        Fibonacci function generator
        generate the fibonacci number at 'i'th posistion
        """
        if i == 0:
            return 0
        elif i == 1:
            return 1
        else:
            return fib_gen_r(i - 1) + fib_gen_r(i - 2)
    

    我可以做到:

    import time
    start_time = time.time()
    print(fib_gen_r(35))
    print(f"--- {time.time() - start_time}s seconds ---\n")
    # >>> 
    # 9227465
    # --- 2.556117296218872s seconds ---
    

    但是,如果我不想每次都写这个,我写了一个函数:

    def time_spend(code_to_check):
        import time
        start_time = time.time()
        print(code_to_check)
        print(f"--- {time.time() - start_time}s seconds ---\n")
    
    time_spend(fib_gen_r(35))
    # >>>
    # check run-time:
    # 9227465
    # --- 0.0s seconds ---
    

    谢谢,

    1 回复  |  直到 7 年前
        1
  •  2
  •   nosklo    7 年前

    你打电话给你的 fib_gen_r 之前 打电话给 time_spend . 相反,您必须将实际函数作为参数传递,而不调用它,并在内部调用它 花时间 .

    time_spend(fib_gen_r(35)) 电话 纤维发电机 首先,完成后,将结果传递给 . 不是你想要的,因为你无法衡量什么已经完成。相反,您希望使用此语法 time_spend(fib_gen_r, 35) 要将实际的函数对象作为参数传递, 不叫它

    def time_spend(code_to_check, *args, **kwds):
        import time
        start_time = time.time()
        result = code_to_check(*args, **kwds)
        print(f"--- {time.time() - start_time}s seconds ---\n")
        return result
    
    
    time_spend(fib_gen_r, 35)
    

    一个更简单的选择是使用上下文管理器( with

    import contextlib
    
    @contextlib.contextmanager
    def time_spend():
        import time
        start_time = time.time()
        yield
        print(f"--- {time.time() - start_time}s seconds ---\n")
    

    然后你可以这样使用它:

    with time_spend():
        fib_gen_r(35)