欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中列表推導式與生成器表達式對比詳解

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

概述

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

列表推導式

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

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

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

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

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)

可以看到隨著元素個數的增加,列表推導式執(zhí)行的時間也相應變長,占用的內存也會變大。

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

生成器表達式

生成器能表達式解決上面的問題,它的元素迭代是惰性的,因此只有需要的時候才生產出來,避免了額外的內存開銷和時間開銷: 生成器表達式不管元素數目多大,創(chuàng)建時都是常數時間,因為它并沒有立即創(chuàng)建元素。

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

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

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

type(even_gen)
# generator

創(chuàng)建生成器表達式的耗時統計:

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)建時間基本不變,而且比列表推導式的耗時要低不少。

使用場景選擇

那么是不是就是說使用中可以用生成器表達式替代列表推導式了呢,也不盡然,因為列表推導式得到的是一個列表,很多便捷操作(如slice等)可以作用到上面,而生成器表達式則不行:

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ū)別:生成器表達式只能迭代一次,而列表推導式可以使用很多次,舉例如下:

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)
    ...:

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

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

因此總結來說,使用建議如下:

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

參考

總結

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

相關文章

  • 使用Python pandas讀取CSV文件應該注意什么?

    使用Python pandas讀取CSV文件應該注意什么?

    本文是給使用pandas的新手而寫,主要列出一些常見的問題,根據筆者所踩過的坑,進行歸納總結,希望對讀者有所幫助,需要的朋友可以參考下
    2021-06-06
  • python實現excel讀寫數據

    python實現excel讀寫數據

    這篇文章主要為大家詳細介紹了python操作EXCEL讀數據、寫數據的實例源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Python的加密模塊md5、sha、crypt使用實例

    Python的加密模塊md5、sha、crypt使用實例

    這篇文章主要介紹了Python的加密模塊md5、sha、crypt使用實例,本文給出了MD5和crypt模塊的代碼實例,需要的朋友可以參考下
    2014-09-09
  • Python?數據可視化超詳細講解折線圖的實現

    Python?數據可視化超詳細講解折線圖的實現

    數據可以幫助我們描述這個世界、闡釋自己的想法和展示自己的成果,但如果只有單調乏味的文本和數字,我們卻往往能難抓住觀眾的眼球。而很多時候,一張漂亮的可視化圖表就足以勝過千言萬語,讓我們來用Python實現一個可視化的折線圖
    2022-03-03
  • Python爬取三國演義的實現方法

    Python爬取三國演義的實現方法

    這篇文章通過實例給大家演示了利用python如何爬取三國演義,對于學習python的朋友們來說是個不錯的實例,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2016-09-09
  • 基于Python制作個搶紅包的工具

    基于Python制作個搶紅包的工具

    快過年了,剛剛收到了兩個消息,一個好消息,一個壞消息。好消息就是微信群里有人要發(fā)紅包,壞消息是不一定能都搶到。所以本文就來用Python做一個搶紅包工具,需要的可以參考一下
    2023-01-01
  • python 實現將字典dict、列表list中的中文正常顯示方法

    python 實現將字典dict、列表list中的中文正常顯示方法

    今天小編就為大家分享一篇python 實現將字典dict、列表list中的中文正常顯示方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 如何分離django中的媒體、靜態(tài)文件和網頁

    如何分離django中的媒體、靜態(tài)文件和網頁

    這篇文章主要介紹了如何分離django中的媒體、靜態(tài)文件和網頁,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Python中內置數據類型list,tuple,dict,set的區(qū)別和用法

    Python中內置數據類型list,tuple,dict,set的區(qū)別和用法

    這篇文章主要給大家介紹了Python中內置數據類型list,tuple,dict,set的區(qū)別和用法,都是非?;A的知識,十分的細致全面,有需要的小伙伴可以參考下。
    2015-12-12
  • Python+Turtle制作海龜迷宮小游戲

    Python+Turtle制作海龜迷宮小游戲

    這篇文章主要是帶大家寫一個利用Turtle庫制作的一款海龜闖關的三大迷宮,文中的示例代碼講解詳細,對我們學習Python有一定幫助,感興趣的可以了解一下
    2022-04-04

最新評論