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

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

傳遞變量與為多次調用的函數重新定義變量的效率

傳遞變量與為多次調用的函數重新定義變量的效率

至尊寶的傳說 2023-09-05 20:28:46
我有一個關于效率的問題,我對處理速度和內存效率都很感興趣。我正在編寫多次調用函數的代碼。在其參數中,有些參數需要保留變量,因為每次調用這些參數時都會使用不同的值來調用該函數。然而,其他的則是不變的,不僅每次調用函數時都是相同的,而且每次運行代碼時都不會改變,甚至在運行之間也不會改變。但是,我仍然想將它們寫為變量而不是對它們進行硬編碼,以便我可以通過描述性名稱來引用它們。在下面的示例中,我期望前兩個效率相同,而最后一個效率不高。但是,我不清楚為什么。有人能幫忙解釋一下嗎?編輯:在下面的示例中,我僅使用 100 次迭代。實際上,我希望以這種方式調用函數數千或數百萬次。編輯2:對于那些只是告訴我對其進行概要分析的人。請注意,我問的是為什么,而不僅僅是是否某些方法比其他方法更有效。分析會回答是否,但不會回答為什么。import numpy as npdef myfunc(a):    (a**4) + np.sqrt(3)*a - a/3for a in arange(100):    y[a] = myfunc(a)相對import numpy as npmyb = 3def myfunc(a):    (a**4) + np.sqrt(myb)*a - a/mybfor a in arange(100):    y[a] = myfunc(a)相對import numpy as npmyb = 3def myfunc(a, b):    (a**4) + np.sqrt(b)*a - a/bfor a in arange(100):    y[a] = myfunc(a, myb)
查看完整描述

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() 的原因。


內存是一個不同的問題,但通常這是由問題本身決定的,而不是由你如何做決定的。當然,在某些情況下,內存會成為一個特殊的問題,您需要變得聰明(批量處理、使用流處理等)。內存問題是,如果能夠知道我們正在討論的數字類型以及數據的總體情況會是什么樣子,那就太好了。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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