Python 提高效率

2021-07-08 20:49:41 字數 3239 閱讀 7045

最近師兄給了小任務,算乙個p值。任務詳情是這樣的:第一步,有基因集a,23個元素,基因集b,451個元素,共有23*451=9922個組合(當然你要考慮去重),看在ppi資料庫(145萬多行資料)中出現的組合總個數(觀察值);第二步,然後再以hg19中基因為背景基因集,放回隨機抽取23個基因構成基因集c(記得要先把451個基因在hg19基因集中去掉),與集合b組合,看在ppi資料庫中出現的組合總個數(期望值)。第二步重複一千萬次,計算期望值大於觀察值的總次數。

師兄給了乙個perl指令碼,說有bug,讓我除錯。當我看到那個指令碼使用就硬生生迴圈一千萬次時候,我決定自己造輪子。

多程序肯定是必須的。

在第乙個版本的,多程序是這樣的。

def run(exp_bg,ppi,bg_gene2,nu):

exp=0

tmp_gene=

#exp_bg 是hg19中基因

gene1=random.sample(exp_bg,23)

gene2=bg_gene2#背景不變=gene[in2]

#gene2=random.sample(exp_bg,n2)

for i in gene1:

for j in gene2:

if i == j :

continue

if [i,j] in tmp_gene or [j,i] in tmp_gene:

continue

for i in tmp_gene:

##cycle 10373

for j in ppi:

if i in ppi or [i[1],i[0]] in ppi:

exp+=1

output_dict[nu]=exp

time1=int(time.time())#start

manager=manager()

output_dict = manager.dict()

pool=pool(processes=cpu)

for nu in range(10000000):

#gene1=random.sample(exp_bg,ppi,bg_gene2,23)

pool.close()

pool.join()

當然這種方式也是能充分利用cpu的,當時沒有考慮效率,算了12小時,依然沒有出結果,師兄說正常半天就完事了。接著就改進吧。

def run(exp_bg,ppi,bg_gene2,nu):

exp=0

tmp_gene=

#exp_bg 是hg19中基因

gene1=random.sample(exp_bg,23)

gene2=bg_gene2#背景不變=gene[in2]

#gene2=random.sample(exp_bg,n2)

tmp_gene=[[i,j] for i in gene1 for j in gene2 if [i,j] in ppi or [j,i] in ppi] #cycle 10373

output_dict[nu]=len(tmp_gene)

time1=int(time.time())#start

manager=manager()

output_dict = manager.dict()

pool=pool(processes=cpu)

for nu in range(10000000):

#gene1=random.sample(exp_bg,23)

)pool.close()

pool.join()

看起來簡省很多,但是實際工作量也並沒有減少,一千萬次*9922次迴圈,好吧,還是給跪了,迴圈還不是問題,最要的是那個in判斷語句,很是拖慢速度。其實整個run函式做的就是兩個集合取交集,然後大神告訴我,a&b 比[ i for i in a if i in b]快的飛起。然後我就用上了python的set函式

def run(exp_bg,ppi,gene2,nu):

exp=0

tmp_gene=

gene1=random.sample(exp_bg,23)

gene2=bg_gene2#背景不變=gene[in2]

tmp_gene=["__".join(sorted([i,j])) for i in gene1 for j in gene2 ]

tmp_gene=set(tmp_gene)

output_dict[nu]=len(tmp_gene&ppi)

##交集

然後就飛起,效率按理說應該很快啊,也確實是這樣。但是在cpu使用上,卻更坑爹了。我在想是不是每次向每個程序傳遞的引數和獲取引數這個耽誤時間了,畢竟,有兩個引數是集合,乙個元素個數是2萬+,乙個是145萬+。當我嘗試用manager.list()來給程序提供這些集合的時候,程式跑得飛快,3個小時左右跑完,驗證的我的猜想。

def run(nu):

exp=0

tmp_gene=

gene1=random.sample(exp_bg,23)

gene2=bg_gene2#背景不變=gene[in2]

tmp_gene=["__".join(sorted([i,j])) for i in gene1 for j in gene2 ]

tmp_gene=set(tmp_gene)

output_dict[nu]=len(tmp_gene&ppi)

time1=int(time.time())#start

manager=manager()

ppi_list=manager.list()

ppi_list=ppi

bg_gene2_list=manager.list()

bg_gene2_list=bg_gene2

exp_bg_list=manager.list()

exp_bg_list=exp_bg

output_dict = manager.dict() pool=pool(processes=cpu)for nu in range(10000000):#gene1=random.sample(

如何提高效率

如果問 你想不想使自己的收入加倍 我猜每個人的答案都是 yes 如果我繼續問 你相不相信現在你的收入會加倍 我想有一些人可能會沒把握,有一些人認為不太可能,我告訴各位 你們每個人的收入一定會加 倍 因為按照每年物價增長率及通貨膨脹的正常速度,20年後你的收入一定會加倍。但是如果你希望,提前在5年內 ...

如何提高效率

在提高班學習有很長的一段時間了,學習的收穫中有一點是非常的明顯,那就是自己的效率明顯的比原來高出許多,現在就按照自己的切身體會來總結一下如何提高自己效率.1 目標 必須要有目標,沒有目標和方向效率會大大的折扣.當然不僅僅是學習,更是生活,事業,和人的整個一生.這點公尺老師非常的重視,每個學習階段都給...

如何提高效率

在提高班學習有很長的一段時間了,學習的收穫中有一點是非常的明顯,那就是自己的效率明顯的比原來高出許多,現在就按照自己的切身體會來總結一下如何提高自己效率.1 目標 必須要有目標,沒有目標和方向效率會大大的折扣.當然不僅僅是學習,更是生活,事業,和人的整個一生.這點公尺老師非常的重視,每個學習階段都給...