簡體   English   中英

使用timeit時無法將列表傳遞給此Python函數

[英]Unable to pass list to this Python function when using 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

# 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引用為空的global subseq 如何正確地將此子序列傳遞給此函數?

PS:我也可以使用其他工具來完成這項工作,只要它可以為我提供該函數每次迭代的確切運行時間(就使用的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]

將代碼與通常要度量的代碼分開並不是一個好主意。
由於您的目標只是衡量算法以檢查結果,因此我建議您在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語句開始到運行所花費的時間也將被計算在內,但這不會顯着改變結果,最重要的是,不會使它失去二次上下文

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM