第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

傳遞變量與為多次調(diào)用的函數(shù)重新定義變量的效率

傳遞變量與為多次調(diào)用的函數(shù)重新定義變量的效率

至尊寶的傳說(shuō) 2023-09-05 20:28:46
我有一個(gè)關(guān)于效率的問(wèn)題,我對(duì)處理速度和內(nèi)存效率都很感興趣。我正在編寫(xiě)多次調(diào)用函數(shù)的代碼。在其參數(shù)中,有些參數(shù)需要保留變量,因?yàn)槊看握{(diào)用這些參數(shù)時(shí)都會(huì)使用不同的值來(lái)調(diào)用該函數(shù)。然而,其他的則是不變的,不僅每次調(diào)用函數(shù)時(shí)都是相同的,而且每次運(yùn)行代碼時(shí)都不會(huì)改變,甚至在運(yùn)行之間也不會(huì)改變。但是,我仍然想將它們寫(xiě)為變量而不是對(duì)它們進(jìn)行硬編碼,以便我可以通過(guò)描述性名稱來(lái)引用它們。在下面的示例中,我期望前兩個(gè)效率相同,而最后一個(gè)效率不高。但是,我不清楚為什么。有人能幫忙解釋一下嗎?編輯:在下面的示例中,我僅使用 100 次迭代。實(shí)際上,我希望以這種方式調(diào)用函數(shù)數(shù)千或數(shù)百萬(wàn)次。編輯2:對(duì)于那些只是告訴我對(duì)其進(jìn)行概要分析的人。請(qǐng)注意,我問(wèn)的是為什么,而不僅僅是是否某些方法比其他方法更有效。分析會(huì)回答是否,但不會(huì)回答為什么。import numpy as npdef myfunc(a):    (a**4) + np.sqrt(3)*a - a/3for a in arange(100):    y[a] = myfunc(a)相對(duì)import numpy as npmyb = 3def myfunc(a):    (a**4) + np.sqrt(myb)*a - a/mybfor a in arange(100):    y[a] = myfunc(a)相對(duì)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貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊

你所說(shuō)的效率水平并不重要。您應(yīng)該擔(dān)心代碼的可讀性,而不是移動(dòng)一些值的效率。如果代碼每次通過(guò)循環(huán)將值傳遞給函數(shù)更具可讀性,即使它們沒(méi)有改變,那么也將它們傳遞給函數(shù)。例如,將事物放入全局變量中通常在理解代碼的作用方面可讀性較差。


這是我整理的一個(gè)例子:


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)

結(jié)果:


658.9874644541911

643.4372986147371

636.6218502753122

475.3660640474451

648.4789890659888

466.2721794578193

595.3755252194462

583.45879143973

498.04278700281304

283.2047039562956

此代碼執(zhí)行一百萬(wàn)次迭代,創(chuàng)建 10 個(gè)隨機(jī)值,將每個(gè)值乘以 100,將它們單獨(dú)傳遞到函數(shù)中,然后在函數(shù)中對(duì)它們求和。每 100,000 次迭代,我都會(huì)打印總和值,作為健全性檢查。


在我的 Macbook Pro 上運(yùn)行只需 2-3 秒。如今我們的計(jì)算機(jī)真的非常非??於夜δ軓?qiáng)大。如此之多以至于幾乎不值得擔(dān)心您所談?wù)摰膬?yōu)化類型。


更新:為了進(jìn)一步推動(dòng)這一點(diǎn),并且因?yàn)槲液芎闷?,我嘗試取出隨機(jī)數(shù)生成,因此運(yùn)行以下命令:


for i in range(1000000):

    foo(i, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

這基本上是瞬時(shí)運(yùn)行的,眨眼間就打印了 55 十次。所以第一個(gè)例子大部分是10M隨機(jī)數(shù)的生成。我將進(jìn)一步指出,由于涉及這些常量,編譯器和處理器可能都在優(yōu)化 wazoo,因?yàn)樵谶@種情況下沒(méi)有任何變化。但這只會(huì)進(jìn)一步推動(dòng)這一點(diǎn)。沒(méi)有理由擔(dān)心傳遞常量值,部分原因是現(xiàn)在的編譯器和處理器會(huì)為您識(shí)別并優(yōu)化此類模式。避免這些優(yōu)化是我在第一個(gè)示例中使用 random() 的原因。


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


查看完整回答
反對(duì) 回復(fù) 2023-09-05
  • 1 回答
  • 0 關(guān)注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)