2016-01-06 53 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