1 回答

TA貢獻1872條經驗 獲得超4個贊
你所說的效率水平并不重要。您應該擔心代碼的可讀性,而不是移動一些值的效率。如果代碼每次通過循環將值傳遞給函數更具可讀性,即使它們沒有改變,那么也將它們傳遞給函數。例如,將事物放入全局變量中通常在理解代碼的作用方面可讀性較差。
這是我整理的一個例子:
import random
def foo(iter, a, b, c, d, e, f, g, h, i ,j):
x = a + b + c + d + e + f + g + h + i + j
if iter % 100000 == 0:
print(x)
for i in range(1000000):
foo(i, random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100,
random.random() * 100)
結果:
658.9874644541911
643.4372986147371
636.6218502753122
475.3660640474451
648.4789890659888
466.2721794578193
595.3755252194462
583.45879143973
498.04278700281304
283.2047039562956
此代碼執行一百萬次迭代,創建 10 個隨機值,將每個值乘以 100,將它們單獨傳遞到函數中,然后在函數中對它們求和。每 100,000 次迭代,我都會打印總和值,作為健全性檢查。
在我的 Macbook Pro 上運行只需 2-3 秒。如今我們的計算機真的非常非??於夜δ軓姶蟆H绱酥嘁灾劣趲缀醪恢档脫哪務摰膬灮愋?。
更新:為了進一步推動這一點,并且因為我很好奇,我嘗試取出隨機數生成,因此運行以下命令:
for i in range(1000000):
foo(i, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
這基本上是瞬時運行的,眨眼間就打印了 55 十次。所以第一個例子大部分是10M隨機數的生成。我將進一步指出,由于涉及這些常量,編譯器和處理器可能都在優化 wazoo,因為在這種情況下沒有任何變化。但這只會進一步推動這一點。沒有理由擔心傳遞常量值,部分原因是現在的編譯器和處理器會為您識別并優化此類模式。避免這些優化是我在第一個示例中使用 random() 的原因。
內存是一個不同的問題,但通常這是由問題本身決定的,而不是由你如何做決定的。當然,在某些情況下,內存會成為一個特殊的問題,您需要變得聰明(批量處理、使用流處理等)。內存問題是,如果能夠知道我們正在討論的數字類型以及數據的總體情況會是什么樣子,那就太好了。
添加回答
舉報