為啥我的Python這麼慢(一)
在Python系列教程中,我們提到一個概念字元串是不可修改的。這一點可以通過函數來判斷確實是對的。但是這個概念會對我們寫作程序有什麼影響一直沒有特別深的理解。
直到有一次,實驗室一個朋友要讀基因組數據,結果發現的基因組讀一晚上都沒讀完,就很詫異,看了下代碼,這麼寫的。
基因組序列是,格式,序列行每行個字元,共44,284,892行 (記住行數有多大),示例如下。
程序看上去沒問題,獲取,讀取一行"追加"在前一行後面,邏輯是對的。然後運行上程序,回去睡覺,滿心歡喜期待第二天早上獲得結果,結果啥也沒出來,程序還停留在讀取基因組序列步驟。
按我們伺服器的性能,這不應該啊。看代碼是不是出問題了,怎麼看邏輯都對。後來就想會不會是序列累加的問題,換了一個寫法。代碼稍微長了些,先存入列表,再連接起來。
使用函數,查看下運行速度,不足1分鐘。及更多程序監測方法見命令運行監測和軟體安裝。
不比不知道,一比嚇一跳;速度差了何止幾千倍。
這時,我們重新理解下什麼叫字元串不可修改。
使用函數來確定字元串累加跟列表累加的不同。(不同電腦或不同時間運行獲得的不同,不看具體數字,只看的變化)
同樣的變數名字,但不同的。就是說python在對變數新增字元串時,是先開闢一份內存空間,把原有內容加新內容組成的字元串存入新的內存空間。而不是想像中的直接追加在已有字元串的後面。這樣對4千萬行數據的操作就是要做4千萬次的內存空間開闢和字元串存儲。這是一個特別耗時的步驟。
而如果是一個列表呢?
而列表就不一樣了,無論是使用增加一個元素,還是使用增加一組元素,列表變數的都沒有變化。說明這是追加,不是新建。
使用中還有不少類似這樣的需要注意的小細節,在後續會陸續推出。
而且在大家的支持下,我們生信寶典團隊要開培訓班了,涉及、、和。如果您有需要我們解決的問題,還請後台留言,一併納入培訓班的授課。希望通過我們的努力,讓培訓發揮作用,不管是來學技術,來學理念,還是來解決你手頭棘手的問題,希望都能有收穫。
具體日期靜待公布。


※盛思PythonEditor離線版升級microbit模擬功能!
※Python批量修改Excel文件格式:加粗、顏色交替、漸變背景色填充
※使用Python探索二手車市場
※Python 之自動獲取公網IP
※總結學習 Python的14 張思維導圖匯總
TAG:Python |