2016-12-28 76 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