2016-01-06 51 views
0

我編寫了一個小腳本來生成具有不同輸入的函數的運行時間。我的意圖是繪製這些數字,並向我自己證明這個函數確實有一個二次運行時間。下面的代碼:無法使用時間將列表傳遞給此Python函數

import timeit 

seq = [875011, 549220, 400865, 913974, 699921, 108386, 328934, 593902, 805659, 916502, 597662] 

subseq = [] 
num = 1000000 # How many times the algorithm must run 

# Quadratic running time 
def quad (S): 
    n = len(S) 
    A = [0] * n 

    for j in range(n): 
     total = 0 
     for i in range(j+1): 
      total += S[i] 
     A[j] = total/(j+1) 

    return A 

def plot_func (name): 
    print('\n') 
    for i in range(len(seq)): 
     subseq = seq[0:i+1] 
     t = timeit.Timer('{}(subseq)'.format(name), 'from __main__ import {}, subseq'.format(name)) 
     print(t.timeit(number=num)) 

plot_func('quad') 

的問題是,運行時間不會改變,那是因爲每次運行時,該功能quad指全球subseq,裏面是空的。我怎樣才能正確地將這個子序列傳遞給這個函數?

P.S .:我也很好地使用另一個工具來完成這項工作,只要它能給我每次迭代函數的確切運行時間(就CPU時間而言)。

+0

@Rogalski這就是意義我研究過'timeit'示例:需要導入函數名稱和變量,以便可以通過'timeit'設置單獨的虛擬環境。你有什麼建議? – dotslash

回答

1

默認情況下,Python認爲subseq是您的函數的局部變量。此本地名稱會影響您將參數傳遞給timeit計時器的全局變量。

爲了使賦值操作全局可見,您需要在功能使用前聲明subseq變量global

def plot_func (name): 
    global subseq 
    print('\n') 
    for i in range(len(seq)): 
     subseq = seq[0:i+1] 
1

要與你想平時測量代碼分開你的代碼是不是一個好主意。
作爲你的目標只是衡量你的算法來檢查的結果,我建議你到裏面timeit範圍運行一切,像下面

import timeit 

num = 1000000 # How many times the algorithm must run 
setup = """ 
    seq = [875011, 549220, 400865, 913974, 699921, 108386, 328934, 593902, 805659, 916502, 597662] 

    subseq = [] 

    # Quadratic running time 
    def quad (S): 
     n = len(S) 
     A = [0] * n 

     for j in range(n): 
      total = 0 
      for i in range(j+1): 
       total += S[i] 
      A[j] = total/(j+1) 

     return A 
    """ 
run_function = """ 
    def plot_func (name): 
     print('\n') 
     for i in range(len(seq)): 
      subseq = seq[0:i+1] 
      print(t.timeit(number=num)) 
    plot_func('quad') 
""" 
timeit.timeit(stmt=run_function, setup=setup, number=num) 

這樣一來,它的範圍內timeit將設置一切,內部運行定義函數它也是如此。
注意到,從print語句運行所花費的時間也將然而計數,這是很重要的,這不會改變顯著的結果,最重要的是,不會讓它失去其二次情況下

+0

謝謝!這也是一個非常乾淨的做法。 – dotslash