2016-12-28 70 views
0

我測量多長時間需要爲我的函數來表示C:時間測量 - 多次進行測量,變量在iterval

C in range (0, 100, 1) 

與從中給出一個列表整數。 有我的代碼:

import itertools 
import time  
def amount(c): 
    a = [1, 2, 5, 10, 20, 50] 

    dp = [[0 for _ in range(len(a))] for __ in range(c + 1)] 
    dp[0][0] = 1 

    for i in range(c): 
     for j in range(len(a)): 
      for k in range(j, len(a)): 
       if i + a[k] <= c: 
        dp[i + a[k]][k] += dp[i][j] 

    return sum(dp[c]) 

我決定建立衡量多久我的函數最後一次通話的功能:

def count_once(c): 
    start = time.perf_counter() 
    amount(c) 
    return time.perf_counter() - start 

這是很容易。現在我想對每個C從0到100進行10次測量,然後對每個C的這些測量的平均值進行計數。因此,輸出應該包含100個數字(每個數字將是平均值)。
我開始與此:

for i in range(0, 101, 1): 
    count_once(i) 
    print(count_once(i)) 

但我不知道我怎麼可以使用該公式來計算10個測量結果的平均值爲每C.

+0

sum([count_once(I)for I in range(100)])/ 100.0? – kabanus

+0

@kabanus但我需要100個不同的平均值。我想測量每個C的時間10次,然後計算每個C的平均值。 – Hendrra

+0

所以,你的意思是你的意思是你想爲10個不同的參數平均count_once 10次以上?說C = 0 ... 9? – kabanus

回答

2

爲什麼不:

for C in range(100): 
    print "C=",C,"averages",sum([count_once(C) for_ in range(10)])/10.0 

你可以很容易地用你想測試的C值的第一個range(100)來更改第一個range(100),第二行的10s和你想要測試的數值相同。

通過消除時間開銷我會去這個有點不同的方式:

def count(c,times): 
    start = time.perf_counter() 
    for _ in range(times): amount(c) 
    return (time.perf_counter() - start)/float(times) 

然後你的外循環就變成了:

for C in range(100): print "C=",C,"averages",count(C,10) 

我可能會使用更多的時間比10(至少說100或1000)。

+0

我想在這裏注意範圍(0,101,1)=範圍(101),併產生從0到100的數字(101個數字)。 – kabanus

+0

非常感謝!這真的對我有幫助,什麼是好的 - 解決方案不是很複雜。是的,當然 - 你是對的。我用範圍犯了一個錯誤。消除時間開銷真的很重要嗎? – Hendrra

+0

通常是。嘗試並測試它!用times = 1,10,100,1000運行計數函數,看看是否有差異!另外,不要忘記標記已接受 - 這就是up/downvote旁邊的V - 所以用戶知道這已被回答。 – kabanus