簡體   English   中英

使用枚舉的好處?

[英]Benefits of using enumerate?

我是Python的初學者。 我想知道列舉一種更有效的方法嗎? 或者在這里沒那么重要,而且只有在做更復雜的事情時才會發揮作用?

我的代碼沒有枚舉:

for x in thing:
    if thing.index(x) % 2 == 0:
        x += 7
        print (x)
    else:
        print (x)

和我的代碼使用枚舉:

for index,x in enumerate(thing):
    if index % 2 == 0:
        x += 7
        print (x)
    else:
        print (x)

list.index的復雜度為O(n) ,這意味着你將遍歷列表兩次以上(也考慮到for循環本身),它返回給定項的第一個索引,這意味着你將得到錯誤具有重復項目的列表的結果。

enumerate通過簡單地生成索引和動態項來解決這個問題; 我不認為你可以獲得比內置enumerate提供的更多的性能。

還要記住, enumerate是懶惰地評估的; 大型清單的巨大優勢。 相反,您不希望調用大型列表的index方法,即使列表中沒有重復項且結果正確,您仍然會在列表中進行不必要的遍歷。

如果您對效率感到疑惑,可以使用幾種工具來檢查哪種解決方案/算法更有效。 這稱為分析

分析的第一個目的是測試代表性系統以識別什么是緩慢的(或使用太多的RAM,或導致太多的磁盤I / O或網絡I / O)。

分析通常會增加開銷(典型的10x到100x減速),並且您仍然希望您的代碼盡可能與現實世界中的代碼類似。 提取測試用例並隔離您需要測試的系統部分。 優選地,它已經被編寫為已經在其自己的一組模塊中。

基本技術包括IPython中的%timeit magic, time.time(),timing decorator (參見下面的示例)。 您可以使用這些技術來理解語句和函數的行為。

然后你有cProfile ,它將為你提供問題的高級視圖,這樣你就可以將注意力轉向關鍵功能。

接下來,查看line_profiler,它將line_profiler,分析您選擇的函數。 結果將包括每行調用的次數以及每行所花費的時間百分比。 這正是您需要了解的信息,以了解運行緩慢的原因和原因。

perf stat可幫助您了解最終在CPU上執行的指令數以及CPU緩存的使用效率。 這允許對矩陣運算進行高級調整。

heapy可以跟蹤Python內存中的所有對象。 這對於追捕奇怪的內存泄漏非常有用。 如果您正在使用長時間運行的系統,那么dowser會讓您感興趣:它允許您通過Web瀏覽器界面在長時間運行的過程中內省活動對象。

為了幫助您了解RAM使用率高的原因,請查看memory_profiler. 它對於跟蹤標記圖表上的RAM使用情況特別有用,因此您可以向同事(或您自己)解釋為什么某些函數使用的RAM比預期的多。

示例:定義裝飾器以自動執行定時測量

from functools import wraps

def timefn(fn):
    @wraps(fn)
    def measure_time(*args, **kwargs):
        t1 = time.time()
        result = fn(*args, **kwargs)
        t2 = time.time()
        print ("@timefn:" + fn.func_name + " took " + str(t2 - t1) + " seconds")
        return result
    return measure_time

@timefn
def your_func(var1, var2):
    ...

有關更多信息,我建議閱讀上面的源代碼的高性能Python (Micha Gorelick; Ian Ozsvald)。

暫無
暫無

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

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