亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Min Max 類似函數,使用 if best == None 和 Python 循環內的條件

Min Max 類似函數,使用 if best == None 和 Python 循環內的條件

瀟湘沐 2023-10-11 16:18:23
在我們需要根據條件搜索最佳元素的函數中(例如 Min Max 函數:搜索最小值或最大值),我看到一些(或許多)人檢查保存最佳答案的變量是否為 None并排循環進行條件檢查。為了說明這一點,讓以下2個源代碼: A)使用循環內的測試:is Nonelist_vals = [10,9,8,7,6,5,4,3,2,1]min_val = Nonefor val in list_vals:    if min_val is None or val<min_val:        min_val = valprint("min = ", min_val)B) 最好的接收第一個元素list_vals = [10,9,8,7,6,5,4,3,2,1]min_val = list_val[0]for val in list_vals:    if val<min_val:        min_val = valprint("min = ", min_val)我的問題是:為什么有些人采用第一種形式(A)?這是一些好的做法嗎?如果我們使用第一個 from,那就意味著在每次迭代中我們都會檢查變量是否為 None,我不知道編譯器是否對此進行了優化。為了查看此示例的執行時間是否相似,我計算了方法A和B的時間:nb = 100000000 # 100_000_000list_vals = random.sample(range(nb), nb)時間(A) = 24.00 秒時間(B) = 19.31 秒我用其他長度重復測試,結果是一樣的,B方法比A方法分析(相對)快。感謝您的幫助。
查看完整描述

1 回答

?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

在一般代碼中,您可能想要使用任意可迭代對象,而不僅僅是list,在這種情況下,只有第一種形式完全有效(您無法索引非序列)。您可能還需要處理潛在的空輸入(A 通過生成 來處理它們None,而 B 引發一個IndexError)。它確實增加了非零成本(CPython 只有最簡單、最本地化的優化器;它不能做出像“min_val僅None在第一個循環上”這樣的廣泛推論)。如果性能至關重要,您可以通過以下方式獲得兩全其美(盡管代碼稍顯丑陋):


vals = ... could be any iterable ...


iter_vals = iter(vals)  # Explicitly convert to iterator (if already an iterator, just returns vals at trivial cost)


min_val = next(iter_vals, None)  # Pulls first value, or None if vals was empty


for val in iter_vals:  # Iterates rest of values looking for minimum

    if val < min_val:

        min_val = val


print("min = ", min_val)

在這種情況下,您不會假設輸入是序列,您不會制作不必要的數據副本(切片會這樣做list_vals[1:]),您不必為初始情況發明哨兵值,因為您可以安全地獲取第一個元素一次,并且您不會針對其自身測試初始值(因為有狀態迭代器僅產生初始值一次)。


查看完整回答
反對 回復 2023-10-11
  • 1 回答
  • 0 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號