我编写了一个小脚本,用不同的输入生成函数的运行时间。我的目的是绘制数字,并向自己证明函数确实有一个二次运行时间。代码如下:
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
,它是空的。如何将此子序列正确传递给此函数?备注:我也可以使用另一个工具来完成这项工作,只要它能给出函数每次迭代的确切运行时间(以使用的CPU时间计)。
最佳答案
默认情况下,Python认为subseq
是函数的局部变量这个局部名称隐藏了将参数传递给timeit
计时器的全局变量。
要使赋值操作全局可见,在函数中使用之前,需要将subseq
变量声明为global
:
def plot_func (name):
global subseq
print('\n')
for i in range(len(seq)):
subseq = seq[0:i+1]