Python循環12種超強寫法,又快又省內存

以下文章來源於Python與算法社區 ,作者zglg

0 前言

說到處理循環,我們習慣使用for, while等,比如依次打印每個列表中的字符:

Python循環12種超強寫法,又快又省內存

在打印內容字節數較小時,全部載入內存後,再打印,沒有問題。可是,如果現在有成千上百萬條車輛行駛軌跡,叫你分析出其中每個客戶的出行規律,堵車情況等,假如是在單機上處理這件事。

你可能首先要面臨,也可能被你忽視,最後代碼都寫好後,才可能暴露出的一個問題:outofmemory, 這在實際項目中經常遇到。

這個問題提醒我們,處理數據時,如何寫出高效利用內存的程序,就顯得很重要。今天,我們就來探討如何高效利用內存,節省內存同時還能把事情辦好。

其實,Python已經準備好一個模塊專門用來處理這件事,它就是itertools 模塊,這裡面幾個函數的功能其實很好理解。

我不打算籠統的介紹它們所能實現的功能,而是想分析這些功能背後的實現代碼,它們如何做到高效節省內存的,Python內核的貢獻者們又是如何寫出一手漂亮的代碼的,這很有趣,不是嗎?

OK,let's go. Hope you enjoy the journey!

1 拼接元素

itertools 中的chain 函數實現元素拼接,原型如下,參數*表示個數可變的參數

chain(iterables)

應用如下:

Python循環12種超強寫法,又快又省內存

哇,不能再好用了,它有點join的味道,但是比join強,它的重點在於參數都是可迭代的實例。

那麼,chain如何實現高效節省內存的呢?chain大概的實現代碼如下:

Python循環12種超強寫法,又快又省內存

以上代碼不難理解,chain本質返回一個生成器,所以它實際上是一次讀入一個元素到內存,所以做到最高效地節省內存。

2 逐個累積

返回列表的累積彙總值,原型:

accumulate(iterable[, func, *, initial=None])

應用如下:

Python循環12種超強寫法,又快又省內存

accumulate大概的實現代碼如下:

Python循環12種超強寫法,又快又省內存

以上代碼,你還好嗎?與chain簡單的yield不同,此處稍微複雜一點,yield有點像return,所以 yield total那行直接就返回一個元素,也就是iterable的第一個元素,因為任何時候這個函數返回的第一個元素就是它的第一個。又因為yield返回的是一個generator對象,比如名字gen,所以next(gen)時,代碼將會執行到 for element in it:這行,而此時的迭代器it 已經指到iterable的第二個元素,OK,相信你懂了!

3 漏斗篩選

它是compress 函數,功能類似於漏斗功能,所以我稱它為漏斗篩選,原型:

compress(data, selectors)

Python循環12種超強寫法,又快又省內存

容易看出,compress返回的元素個數等於兩個參數中較短的列表長度。

它的大概實現代碼:

Python循環12種超強寫法,又快又省內存

這個函數非常好用

4 段位篩選

掃描列表,不滿足條件處開始往後保留,原型如下:

dropwhile(predicate, iterable)

應用例子:

Python循環12種超強寫法,又快又省內存

實現它的大概代碼如下:

Python循環12種超強寫法,又快又省內存

5 段位篩選2

掃描列表,只要滿足條件就從可迭代對象中返回元素,直到不滿足條件為止,原型如下:

takewhile(predicate, iterable)

應用例子:

Python循環12種超強寫法,又快又省內存

實現它的大概代碼如下:

6 次品篩選

掃描列表,只要不滿足條件都保留,原型如下:

dropwhile(predicate, iterable)

應用例子:

Python循環12種超強寫法,又快又省內存

實現它的大概代碼如下:

Python循環12種超強寫法,又快又省內存

7 切片篩選

Python中的普通切片操作,比如:

Python循環12種超強寫法,又快又省內存

它們的缺陷還是lis 必須全部載入內存,所以更節省內存的操作islice,原型如下:

islice(iterable, start, stop[, step])

應用例子:

Python循環12種超強寫法,又快又省內存

實現它的大概代碼如下:

Python循環12種超強寫法,又快又省內存

巧妙利用生成器迭代結束時會拋出異常StopIteration,做一些邊界處理的事情。

8 細胞分裂

tee函數類似於我們熟知的細胞分裂,它能複製原迭代器n個,原型如下:

tee(iterable, n=2)

應用如下,可以看出複製出的兩個迭代器是獨立的

Python循環12種超強寫法,又快又省內存

實現它的代碼大概如下:

Python循環12種超強寫法,又快又省內存

tee 實現內部使用一個隊列類型deques,起初生成空隊列,向複製出來的每個隊列中添加元素newval, 同時yield 當前被調用的mydeque中的最左元素。

9 map變體

starmap可以看做是map的變體,它能更加節省內存,同時iterable的元素必須也為可迭代對象,原型如下:

starmap(function, iterable)

應用它:

Python循環12種超強寫法,又快又省內存

starmap的實現細節如下:

Python循環12種超強寫法,又快又省內存

10 複製元素

repeat實現複製元素n次,原型如下:

repeat(object[, times])

應用如下:

Python循環12種超強寫法,又快又省內存

它的實現細節大概如下:

Python循環12種超強寫法,又快又省內存

11 笛卡爾積

笛卡爾積實現的效果同下:

Python循環12種超強寫法,又快又省內存

所以,笛卡爾積的實現效果如下:

Python循環12種超強寫法,又快又省內存

它的實現細節:

Python循環12種超強寫法,又快又省內存

12 加強版zip

組合值。若可迭代對象的長度未對齊,將根據 fillvalue 填充缺失值,注意:迭代持續到耗光最長的可迭代對象,效果如下:

Python循環12種超強寫法,又快又省內存

它的實現細節:

Python循環12種超強寫法,又快又省內存

它裡面使用repeat,也就是在可迭代對象的長度未對齊時,根據 fillvalue 填充缺失值。理解上面代碼的關鍵是迭代器對象(iter),next方法的特殊性:

Python循環12種超強寫法,又快又省內存

結合這個提示再理解上面代碼,就不會吃力。

對於想學python的小夥伴,我這裡整理了一套自己的python系統學習教程,

想要這些資料的可以關注私信“資料”領取資料,希望能對你有所幫助。

本套教程學習時間15天

1-3天內容:為Linux基礎命令

4-13天內容:為Python基礎教程14-15 天內容:為飛機大戰項目演練

Python循環12種超強寫法,又快又省內存

第一階段(1-3天):

該階段首先通過介紹不同領域的三種操作系統,操作系統的發展簡史以及Linux系統的文件目錄結構讓大家對Linux系統有一個簡單的認識,同時知道為什麼要學習Linux命令。然後我們會正式學習Linux命令

1. 文件和目錄命令:ls,cd,touch,mkdir,rm

2. 拷貝和移動命令:tree,cp,mv

3. 文件內容命令:cat,more,grep

4. 遠程管理命令:ifconfig,ping,SSH的工作方式簡介以及ssh命令

5. 用戶權限及用戶管理命令:chmod,chgrp,useradd,passwd,userdel

6. 軟件安裝及壓縮命令:apt簡介及命令,tar,gzip壓縮命令,bzip2壓縮命令

7. vim的基本使用

第二階段(4-10天)

該階段我們正式進入Python這門語言的學習,首先通過了解Python語言的起源,Python語言的設計目標,Python語言的設計哲學,Python語言的優缺點和麵向對象的基本概念,以及Python語言的執行方式,還有Python集成開發環境PyCharm的使用為我們接下來的學習做鋪墊。

然後我們會學習int,string,float三種簡單的變量類型,變量間的計算,變量的輸入輸出,if判斷語句,while循環語句,for循環語句,break和continue的使用,函數的基本使用,模塊的使用,列表,元組,字典三種高級變量,字符串的常用操作。

接下來我們會通過一個名片管理系統的案例,把這一階段的知識進行一個串聯。在學習名片管理系統時,首先我們會學習怎麼去搭建這一系統的框架,然後我們會分別實現新增名片,顯示全部名片,查詢名片,刪除名片,修改名片這些功能。

最後我們會學習語法的進階內容,全局變量,局部變量,可變數據類型和不可變數據類型以及函數返回多個值,函數的缺省參數,多值參數,遞歸的基本使用。

第三階段(11-13天)

該階段我們會學習面向對象(OOP)這一重要的編程思想,首先學習的知識點有類和對象的基本概念,dir函數,self的作用,初始化方法__init__,內置函數__str__,__del__,單繼承,方法重寫,私有屬性和方法,多繼承,多態,類屬性,靜態方法。

然後我們還會學習單例模式這一設計模式,異常的捕獲,異常的拋出,from import局部導入,from import導入同名工具, from import導入所有工具,包的使用,製作模塊,pip的使用以及文件的相關操作。

第四階段(14-15天)

該階段是項目演練階段,我們會帶領大家通過使用之前學習過的知識開發飛機大戰這一經典遊戲,項目中分別有遊戲窗口,圖像繪製,遊戲循環,事件監聽,精靈和精靈組以及創建敵機,創建英雄和發射子彈,碰撞檢測等模塊。

Python循環12種超強寫法,又快又省內存

轉發文章+私信小編(資料)即可領取以下學習教程!

下面是北京大學畢業的高琪老師親手打造的python學習路線和視頻。共分為7大階段.

獲取在文末!!!

Python循環12種超強寫法,又快又省內存


Python循環12種超強寫法,又快又省內存

第一階段

Python循環12種超強寫法,又快又省內存

python開發基礎和核心特性

1.變量及運算符

2.分支及循環

3.循環及字符串

4.列表及嵌套列表

5.字典及項目練習

6.函數的使用

7.遞歸及文件處理

8.文件

9.面向對象

10.設計模式及異常處理

11.異常及模塊的使用

12.坦克大戰

13.核心編程

14.高級特性

15.內存管理

第二階段

Python循環12種超強寫法,又快又省內存

數據庫和linux基礎

1.併發編程

2.網絡通信

3.MySQL

4.Linux

5.正則表達式

第三階段

Python循環12種超強寫法,又快又省內存

web前端開發基礎

1.html基本標籤

2.css樣式

3.css浮動和定位

4.js基礎

5.js對象和函數

6.js定時器和DOM

7.js事件響應

8.使用jquery

9.jquery動畫特效

10.Ajax異步網絡請求

第四階段

Python循環12種超強寫法,又快又省內存

Python Web框架階段

1.Django-Git版本控制

2.Django-博客項目

3.Django-商城項目

4.Django模型層

5.Django入門

6.Django模板層

7.Django視圖層

8.Tornado框架

第五階段

Python循環12種超強寫法,又快又省內存

Python 爬蟲實戰開發

1.Python爬蟲基礎

2.Python爬蟲Scrapy框架

以上這python自學教程小編已經為大家打包準備好了,希望對正在學習的你有所幫助!

Python循環12種超強寫法,又快又省內存


Python循環12種超強寫法,又快又省內存

老規矩,轉發+關注並私信小編:“資料”即可帶走哦


分享到:


相關文章: