日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

为啥我的Python这么慢 (一)

發布時間:2025/3/15 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为啥我的Python这么慢 (一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歡迎關注生信寶典http://mp.weixin.qq.com/s/n5kkZfC8FGlzeBODarLHcw

長假結束了,這不痛苦。痛苦的是長假結束了,發現寫的基因組讀取程序還沒運行完?

在Python系列教程中,我們提到一個概念字符串是不可修改的。這一點可以通過id函數來判斷確實是對的。但是這個概念會對我們寫作程序有什么影響一直沒有特別深的理解。

直到有一次,實驗室一個朋友要讀基因組數據,結果發現3 G的基因組讀一晚上都沒讀完,就很詫異,看了下代碼,這么寫的。

基因組序列是GRCh38.fa,FASTA格式,序列行每行70個字符,共44,284,892行 (記住行數有多大),示例如下。

>chr1 NNNNN...(60個N)...NNNNN ACGTA...(60個Nt)...ACGTA ... >chr2 NNNNN...(60個N)...NNNNN ACGTA...(60個Nt)...ACGTA ...

讀取程序如下(這里只選了讀取基因組的部分,點擊查看更多FASTA的操作):

aDict = {} for line in open("GRCh38.fa"):if line[0] == '>':key = line[1:-1]aDict[key] = ''else:aDict[key]+=line.strip()

程序看上去沒問題,獲取id,讀取一行附加在前一行后面,邏輯是對的。然后運行上程序,回去睡覺,滿心歡喜期待第二天早上出來獲得結果,結果啥也沒出來,程序還停留在讀取基因組序列步驟。

按我們服務器的性能,這不應該啊。就看代碼是不是出問題了,怎么看邏輯都對。后來就想會不會是序列累加的問題,就換了一個寫法。代碼稍微長了些,先存入列表,再連接起來。

Dict = {} for line in open("GRCh38.fa"):if line[0] == '>':key = line[1:-1]aDict[key] = []else:aDict[key].append(line.strip()) #-------------------------------- for key, value in aDict.items():aDict[key] = ''.join(value)

使用time函數,查看下運行速度,不足1分鐘。time及更多程序監測方法見命令運行監測和軟件安裝。

time readFaJoin.py real 0m51.256s user 0m40.729s sys 0m10.425s

不比不知道,一比嚇一跳;速度差了何止幾千倍。

這時,我們重新理解下什么叫字符串不可修改。

使用id函數來確定字符串累加跟列表累加的不同。(不同電腦或不同時間允許的id不同,不看具體數字,只看id的變化)

ehbio = "Sheng Xin Bao Dian" id(ehbio)## Output: 140405359946640ehbio += ' very good' ehbio## Output: 'Sheng Xin Bao Dian very good'id(ehbio)## Output: 140405344262576

同樣的變量名字,但不同的id。就是說python在對變量ehbio新增字符串時,是先開辟一份內存空間,把ehbio原有內容加新內容組成的字符串存入新的內存空間。而不是想象中的直接追加在已有字符串的后面。這樣對4千萬行數據的操作就是要做4千萬次的內存空間開辟和字符串存儲。這是一個特別耗時的步驟。

而如果是一個列表呢?

aList = ['Sheng','Xin']id(aList)## Output: 140405344245520aList.append("Bao")id(aList)## Output: 140405344245520aList.extend(["Dian", "excellent"])id(aList)## Output: 140405344245520

而列表就不一樣了,無論是使用append增加一個元素,還是使用extend增加一組元素,列表變量aList的id都沒有變化。說明這是追加,不是新建。

Python使用中還有不少類似這樣的需要注意的小細節,在后續會陸續推出。

而且我們生信寶典團隊要開培訓班了,涉及Linux系統操作、Python編程、R Cytoscape作圖和高通量數據分析。如果您有需要我們解決的問題,還請后臺留言,一并納入培訓班的授課。希望通過我們的努力,讓培訓發揮作用,不管是來學技術,來學理念,還是來解決你手頭棘手的問題,希望都能有所收獲。

具體日期靜待公布。

總結

以上是生活随笔為你收集整理的为啥我的Python这么慢 (一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。