2016-12-29 65 views
2

我建立了兩個函數來查找素數因子。一個版本比大數量的其他功能慢。我想評估這兩個函數的運行時間。要做到這一點,我建立了一個裝飾者來評估黯然失色的時間。 由於我插入裝飾器,我的兩個函數返回None。我的代碼有什麼問題?修飾器使函數返回無

import math 
import time 

def time_usage(func): 
    def wrapper(*args, **kwargs): 
     beg_ts = time.time() 
     func(*args, **kwargs) 
     end_ts = time.time() 
     print("[INFO] elapsed time: %f" % (end_ts - beg_ts)) 
    return wrapper 

@time_usage 
def find_factors(n): 
    factors = [] 
    i = 2 
    while i < n: 
     while (n % i) == 0: 
      factors.append(i) 
      n /= i 
     i += 1 
    if n > 1: 
     factors.append(n) 
    return factors 

@time_usage 
def improved_prime_factor(n): 
    factors = [] 
    # No need to test whether the number is divisible by any 
    # even number other than 2 
    while n % 2 == 0: 
     factors.append(2) 
     n /= 2 
    i = 3 
    # If n = p * q, either p or q must be <= sqrt(n) 
    max_factor = math.sqrt(n) 
    while i <= max_factor: 
     while n % i == 0: 
      factors.append(i) 
      n /= i 
      # Update the upper band on possible factors 
      max_factor = math.sqrt(n) 
     i += 2 
    if n > 1: 
     factors.append(n) 
    return factors 

if __name__ == '__main__': 
    print(improved_prime_factor(125556)) # return None 
    print(find_factors(125556)) # return None 
+0

裝飾wrapper方法,因爲你沒有快速回復返回您的函數調用的結果 – styvane

回答

6

您需要退回func(*args, **kwargs)。此外,它是一個很好的做法,與functools.wraps

import functools 


def time_usage(func):  
    @functools.wraps 
    def wrapper(*args, **kwargs): 
     beg_ts = time.time() 
     result = func(*args, **kwargs) # save the result to a name 
     end_ts = time.time() 
     print("[INFO] elapsed time: %f" % (end_ts - beg_ts)) 
     return result # return the name 
    return wrapper 
+0

十分感謝。我是裝飾者新手,所以我錯過了那部分。 – Michael