最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中列表推導(dǎo)式與生成器表達(dá)式對比詳解

 更新時間:2023年01月07日 10:14:50   作者:YunfengWang  
python當(dāng)然不是一門編譯型語言,但是它還是要被解析成二進(jìn)制的字節(jié)碼才能被執(zhí)行,執(zhí)行它的正是python解釋器,下面這篇文章主要給大家介紹了關(guān)于python中列表推導(dǎo)式與生成器表達(dá)式對比的相關(guān)資料,需要的朋友可以參考下

概述

Python中的列表推倒式(List Comprehension) 和 生成器表達(dá)式(Generator Expression)是兩種很相似的表達(dá)式,但含義卻不大不同,這里做一個對比。

列表推導(dǎo)式

列表推導(dǎo)式是比較常用的技術(shù),能將本來需要for loop 和 if else 語句的情況簡化成一條指令,最終得到一個列表對象:

even = [e for e in range(10) if e % 2 == 0]

具體細(xì)節(jié)不過多展開,相信很多使用Python的人都已經(jīng)足夠了解這種語法了。

需要注意的一點(diǎn)是,列表推導(dǎo)式不是惰性計(jì)算 ( Lazy Loading) 的,因此所有的列表成員都在聲明完語句后立即計(jì)算 (Eager Loading),因此在數(shù)組成員很多的情況下,速度會很慢,例如下面的在IPython環(huán)境里面的三個列表推導(dǎo)式的耗時統(tǒng)計(jì):

In [1]: %timeit even = [e for e in range(100000) if e % 2 == 0]
5.5 ms ± 24.8 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [2]: %timeit even = [e for e in range(1000000) if e % 2 == 0]
58.9 ms ± 440 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [3]: %timeit even = [e for e in range(100000000) if e % 2 == 0]
5.65 s ± 26.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

可以看到隨著元素個數(shù)的增加,列表推導(dǎo)式執(zhí)行的時間也相應(yīng)變長,占用的內(nèi)存也會變大。

有一種情況是,我們定義了很多很多的數(shù)組元素,但是最后并不是所有的元素都能用到,例如經(jīng)過幾條命令,最后可能只有列表里面的前10個元素會用到,或者只有符合某些條件的元素會用到,這樣的話,Eager模式就白白花費(fèi)了時間,白白花費(fèi)了內(nèi)存來創(chuàng)建很多用不到的元素,這顯然有很大的改進(jìn)空間。

生成器表達(dá)式

生成器能表達(dá)式解決上面的問題,它的元素迭代是惰性的,因此只有需要的時候才生產(chǎn)出來,避免了額外的內(nèi)存開銷和時間開銷: 生成器表達(dá)式不管元素?cái)?shù)目多大,創(chuàng)建時都是常數(shù)時間,因?yàn)樗]有立即創(chuàng)建元素。

那么生成器表達(dá)式的語法是怎么樣的呢,很簡單,只需要把列表推導(dǎo)式中的方括號改為圓括號:

even_gen = (e for e in range(10) if e % 2 == 0)

注意它的類型是生成器類型:

type(even_gen)
# generator

創(chuàng)建生成器表達(dá)式的耗時統(tǒng)計(jì):

In [1]: %timeit even_gen = (e for e in range(100000) if e % 2 == 0)
376 ns ± 2.61 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

In [2]: %timeit even_gen = (e for e in range(10000000) if e % 2 == 0)
382 ns ± 1.63 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

In [3]: %timeit even_gen = (e for e in range(1000000000) if e % 2 == 0)
384 ns ± 2.85 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

可以看到隨著元素的增加,創(chuàng)建時間基本不變,而且比列表推導(dǎo)式的耗時要低不少。

使用場景選擇

那么是不是就是說使用中可以用生成器表達(dá)式替代列表推導(dǎo)式了呢,也不盡然,因?yàn)榱斜硗茖?dǎo)式得到的是一個列表,很多便捷操作(如slice等)可以作用到上面,而生成器表達(dá)式則不行:

In [17]: even = [e for e in range(10) if e % 2 == 0]

In [18]: even[:3]
Out[18]: [0, 2, 4]

In [19]: even_gen = (e for e in range(10) if e % 2 == 0)

In [20]: even_gen[:3]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [20], in <cell line: 1>()
----> 1 even_gen[:3]

TypeError: 'generator' object is not subscriptable

而且兩者有一個致命的區(qū)別:生成器表達(dá)式只能迭代一次,而列表推導(dǎo)式可以使用很多次,舉例如下:

In [22]: even_gen = (e for e in range(10) if e % 2 == 0)

In [23]: for e in even_gen:
    ...:     print(e)
    ...:
0
2
4
6
8

In [24]: for e in even_gen:
    ...:     print(e)
    ...:

可以看到生成器表達(dá)式在第二次迭代的時候,里面已經(jīng)沒有元素了!即第一次迭代已經(jīng)全部生成出來了,而列表推導(dǎo)式是每次迭代都是有相同的內(nèi)容:

In [25]: even = [e for e in range(10) if e % 2 == 0]

In [26]: for e in even:
    ...:     print(e)
    ...:
0
2
4
6
8

In [27]: for e in even:
    ...:     print(e)
    ...:
0
2
4
6
8

因此總結(jié)來說,使用建議如下:

  • 如果要多次迭代時,建議使用列表推導(dǎo)式
  • 如果數(shù)組很大或者有無窮個元素,建議使用生成器表達(dá)式
  • 其他場景:兩者均可,自己看情況使用一個,如果沒有速度和方便度的問題即可,如果有問題換另一個再試試

參考

總結(jié)

到此這篇關(guān)于python中列表推導(dǎo)式與生成器表達(dá)式對比的文章就介紹到這了,更多相關(guān)python 列表推導(dǎo)式和生成器表達(dá)式對比內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用python實(shí)現(xiàn)ftp的文件讀寫方法

    使用python實(shí)現(xiàn)ftp的文件讀寫方法

    今天小編就為大家分享一篇使用python實(shí)現(xiàn)ftp的文件讀寫方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python_tkinter彈出對話框創(chuàng)建2

    python_tkinter彈出對話框創(chuàng)建2

    這篇文章主要介紹了python_tkinter彈出對話框創(chuàng)建,上以篇文章我們簡單的對對話框創(chuàng)建做了簡單介紹,本文將繼續(xù)更多相關(guān)內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • 中秋送禮分配不均這款python刮刮卡完美解決問題

    中秋送禮分配不均這款python刮刮卡完美解決問題

    這篇文章主要介紹了用Python實(shí)現(xiàn)一個抽獎刮刮卡來解決給小朋友的禮物不均,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2021-09-09
  • python如何控制進(jìn)程或者線程的個數(shù)

    python如何控制進(jìn)程或者線程的個數(shù)

    這篇文章主要介紹了python如何控制進(jìn)程或者線程的個數(shù),幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-10-10
  • 詳解python中g(shù)roupby函數(shù)通俗易懂

    詳解python中g(shù)roupby函數(shù)通俗易懂

    這篇文章主要介紹了詳解python中g(shù)roupby函數(shù)通俗易懂,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 對dataframe進(jìn)行列相加,行相加的實(shí)例

    對dataframe進(jìn)行列相加,行相加的實(shí)例

    今天小編就為大家分享一篇對dataframe進(jìn)行列相加,行相加的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python實(shí)現(xiàn)從概率分布中隨機(jī)采樣

    Python實(shí)現(xiàn)從概率分布中隨機(jī)采樣

    這篇文章主要介紹了通過幾個機(jī)器學(xué)習(xí)中最常用的概率分布為例,來看看如何從一個概率分布中采樣,文章中的代碼對我們的工作或?qū)W習(xí)具有一定價值,感興趣的朋友可以了解一下
    2021-12-12
  • Python裝飾器使用示例及實(shí)際應(yīng)用例子

    Python裝飾器使用示例及實(shí)際應(yīng)用例子

    這篇文章主要介紹了Python裝飾器使用示例及實(shí)際應(yīng)用例子,本文給出了斐波拉契數(shù)列、注冊回調(diào)函數(shù)、mysql封裝、線程異步等實(shí)際使用示例,需要的朋友可以參考下
    2015-03-03
  • python實(shí)現(xiàn)感知機(jī)線性分類模型示例代碼

    python實(shí)現(xiàn)感知機(jī)線性分類模型示例代碼

    這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)感知機(jī)線性分類模型的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Python中利用原始套接字進(jìn)行網(wǎng)絡(luò)編程的示例

    Python中利用原始套接字進(jìn)行網(wǎng)絡(luò)編程的示例

    這篇文章主要介紹了Python中利用原始套接字進(jìn)行網(wǎng)絡(luò)編程的示例,使用sock_raw接受和發(fā)送數(shù)據(jù)包可以避開網(wǎng)絡(luò)協(xié)議的諸多限制,需要的朋友可以參考下
    2015-05-05

最新評論

霍林郭勒市| 康乐县| 富顺县| 桃园市| 永定县| 砀山县| 霍林郭勒市| 琼结县| 遂宁市| 临武县| 佛坪县| 荔浦县| 德安县| 繁峙县| 家居| 长武县| 彭山县| 恩施市| 昭平县| 甘肃省| 上饶市| 文安县| 紫阳县| 沂源县| 新昌县| 且末县| 天柱县| 绍兴市| 田东县| 巨野县| 齐齐哈尔市| 阜阳市| 西充县| 北宁市| 兴业县| 深水埗区| 丘北县| 普兰店市| 织金县| 务川| 双流县|