我编写了一个小脚本,用不同的输入生成函数的运行时间。我的目的是绘制数字,并向自己证明函数确实有一个二次运行时间。代码如下:

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]

09-15 15:29