Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用timeit时无法将列表传递给此Python函数_Python_Algorithm_Timeit - Fatal编程技术网

使用timeit时无法将列表传递给此Python函数

使用timeit时无法将列表传递给此Python函数,python,algorithm,timeit,Python,Algorithm,Timeit,我编写了一个小脚本来生成具有不同输入的函数的运行时间。我的目的是绘制数字,并向自己证明函数确实具有二次运行时间。代码如下: import timeit seq = [875011, 549220, 400865, 913974, 699921, 108386, 328934, 593902, 805659, 916502, 597662] subseq = [] num = 1000000 # How many times the algorithm must run # Quadrati

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

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
timer的全局变量

要使赋值操作全局可见,您需要将
subseq
变量声明为
global
,然后才能在函数中使用它:

def plot_func (name):
    global subseq
    print('\n')
    for i in range(len(seq)):
        subseq = seq[0:i+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
语句运行所花费的时间也将被计算在内,但是,这不会显著改变结果,最重要的是,不会使它失去二次上下文

@Rogalski这就是我通过查看
timeit
示例得到的感觉:需要导入函数名和变量,以便可以通过
timeit
设置单独的虚拟环境。你推荐什么?谢谢!这也是一个非常巧妙的方法。