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

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

與多行循環(huán)相比,單行循環(huán)是否可以節(jié)省 python 代碼的運(yùn)行時(shí)間?

與多行循環(huán)相比,單行循環(huán)是否可以節(jié)省 python 代碼的運(yùn)行時(shí)間?

人到中年有點(diǎn)甜 2023-10-31 16:11:30
我想知道如何減少程序的運(yùn)行時(shí)間。使用單線循環(huán)比多線循環(huán)更有效嗎?#is this more efficienttotal_data = [[arr1[j][i] for j in range(3)]+ arr2[i][0] for i in range(10000)]#instead oftotal_data = []for i in range(10000):    arr3 = []    a2 = arr2[i][0]    for j in range(3):        arr3.append(arr1[j][i])    total_data.append(arr3+a2)另外,在調(diào)用函數(shù)時(shí),使用map是否比for循環(huán)更節(jié)省時(shí)間?#thisf1 = map(func1, var1, var2)arr = map(func2, f2, var3, var4)#instead of thisarr = []for i in range(1000):    f1 = func1(var1(i), var2(i))    f2 = func2(f1(i))    arr.append(f2, var3, var4)我的數(shù)據(jù)集很大,每個(gè)函數(shù)運(yùn)行時(shí)間也很可觀,所以我想盡可能減少時(shí)間。我想從根本上知道增加Python中同一循環(huán)的行數(shù)是否會增加時(shí)間。
查看完整描述

3 回答

?
Smart貓小萌

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊

更多代碼行是否意味著性能降低的問題是有缺陷的,因?yàn)閮烧叨疾皇?code>less lines ≠ performance ≠ more lines。性能取決于 Python 代碼如何解析為執(zhí)行它的底層 C 函數(shù)調(diào)用,這主要是解析器/解釋器的實(shí)現(xiàn)細(xì)節(jié),與行數(shù)沒有一一對應(yīng)。

也就是說,在選擇循環(huán)、列表理解和映射時(shí)需要考慮以下幾點(diǎn)。

  • 當(dāng)代碼的目的是創(chuàng)建某個(gè)內(nèi)容的列表時(shí),列表推導(dǎo)式通常比循環(huán)更快。據(jù)我所知,這與第二次調(diào)用追加方法有關(guān),而且因?yàn)樵隽苛斜順?gòu)造可能會導(dǎo)致列表大小調(diào)整,從而導(dǎo)致一些內(nèi)存重新分配開銷。

  • 無論在哪里調(diào)用,調(diào)用 python 函數(shù)都是一個(gè)緩慢的操作。引用這個(gè)偉大的答案:A function call needs to manipulate the stack, pushing the local frame onto it, creating a new frame, then clear it all up again when the function returns.一個(gè)例外是用 C 編寫的函數(shù),例如來自操作員模塊的函數(shù),它們比本地 Python 對應(yīng)項(xiàng)稍快。

也就是說,我已經(jīng)使用與此類似的代碼進(jìn)行了一些分析,并且我的測試表明循環(huán)是最慢的選項(xiàng)。有趣的是,測試還表明地圖比列表理解稍快(與鏈接的答案相反)。代碼及結(jié)果如下:

ls = list(range(1000000))


def f(x):

? ? return x+1


def list_comprehension(ls):

? ? return [f(x) for x in ls]


def for_loop(ls):

? ? arr = []

? ? for x in ls:

? ? ? ? arr.append(f(x))

? ? return arr


def map_(ls):

? ? return list(map(f, ls))


if __name__ == "__main__":

? ? import cProfile

? ? for fn in [list_comprehension, for_loop, map_]:

? ? ? ? print('=' * 25)

? ? ? ? print("Profiling:", fn.__name__)

? ? ? ? print('=' * 25)

? ? ? ? pr = cProfile.Profile()

? ? ? ? for i in range(1000):

? ? ? ? ? ? pr.runcall(fn, ls)

? ? ? ? pr.create_stats()

? ? ? ? pr.print_stats()


# Output

=========================

Profiling: list_comprehension

=========================

? ? ? ? ?1000003000 function calls in 235.641 seconds


? ?Ordered by: standard name


? ?ncalls? tottime? percall? cumtime? percall filename:lineno(function)

1000000000? 104.000? ? 0.000? 104.000? ? 0.000 aa.py:5(f)

? ? ?1000? ? 0.008? ? 0.000? 235.640? ? 0.236 aa.py:8(list_comprehension)

? ? ?1000? 131.632? ? 0.132? 235.632? ? 0.236 aa.py:9(<listcomp>)

? ? ?1000? ? 0.001? ? 0.000? ? 0.001? ? 0.000 {method 'disable' of '_lsprof.Profiler' objects}



=========================

Profiling: for_loop

=========================

? ? ? ? ?2000002000 function calls in 410.884 seconds


? ?Ordered by: standard name


? ?ncalls? tottime? percall? cumtime? percall filename:lineno(function)

? ? ?1000? 242.083? ? 0.242? 410.883? ? 0.411 aa.py:11(for_loop)

1000000000? 107.727? ? 0.000? 107.727? ? 0.000 aa.py:5(f)

1000000000? ?61.073? ? 0.000? ?61.073? ? 0.000 {method 'append' of 'list' objects}

? ? ?1000? ? 0.001? ? 0.000? ? 0.001? ? 0.000 {method 'disable' of '_lsprof.Profiler' objects}



=========================

Profiling: map_

=========================

? ? ? ? ?1000002000 function calls in 205.035 seconds


? ?Ordered by: standard name


? ?ncalls? tottime? percall? cumtime? percall filename:lineno(function)

? ? ?1000? 102.451? ? 0.102? 205.034? ? 0.205 aa.py:17(map_)

1000000000? 102.583? ? 0.000? 102.583? ? 0.000 aa.py:5(f)

? ? ?1000? ? 0.001? ? 0.000? ? 0.001? ? 0.000 {method 'disable' of '_lsprof.Profiler' objects}

無論如何,在這種情況下最好的辦法是寫下所有不同的版本并自己進(jìn)行分析,而不是依賴一般假設(shè)。


查看完整回答
反對 回復(fù) 2023-10-31
?
ibeautiful

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊

單行代碼可能比較長的代碼更快,但這不是一般規(guī)則。一些允許非常緊湊的代碼的 python 函數(shù)(如 any()、all() 等)經(jīng)過優(yōu)化,可以非??焖俚貓?zhí)行,并且可能比 (例如)幾個(gè)執(zhí)行相同工作的嵌套循環(huán)。編譯器/解釋器并不真正關(guān)心它必須處理多少文本(除非您的代碼由數(shù)千行代碼組成)。單行是首選,因?yàn)樗?jié)省了空間并使代碼更具可讀性。



查看完整回答
反對 回復(fù) 2023-10-31
?
白豬掌柜的

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊

行數(shù)與代碼的執(zhí)行完全無關(guān)。py 文件將被讀取一次、解析和編譯。隨后,將執(zhí)行編譯后的代碼。

換句話說,如果您創(chuàng)建一個(gè)包含 10 GB 空白的文件,是的,這會影響解析時(shí)間,但即使如此,執(zhí)行也不會受到影響。

兩種變體之間的區(qū)別在于,一種使用列表理解來創(chuàng)建列表,而另一種則創(chuàng)建一個(gè)空列表,然后填充它。我的直覺是,列表理解理論上更容易優(yōu)化,但如果你真的關(guān)心微小的差異,你應(yīng)該分析它。

另一方面,執(zhí)行時(shí)間的微小差異很少會導(dǎo)致代碼看起來更糟糕,因此默認(rèn)情況下您應(yīng)該始終選擇更優(yōu)雅的解決方案。


查看完整回答
反對 回復(fù) 2023-10-31
  • 3 回答
  • 0 關(guān)注
  • 225 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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