如何在python中优化大型列表笛卡尔乘积的代码
我只做了几个月的编程,但我已经做了研究并尝试了这段代码 我目前有2个文件。第一个包含±300万对蛋白质ID(字符串)。 第二个包含每个蛋白质的枚举列表,并为其包含的每个特征分配一个唯一的编号:即,如果蛋白质包含3个特征,它将显示为蛋白质1、蛋白质2、蛋白质3。一些蛋白质可以有多达3000个特征 我想要一个功能交互对的列表 到目前为止,我的代码是:如何在python中优化大型列表笛卡尔乘积的代码,python,bioinformatics,cartesian-product,Python,Bioinformatics,Cartesian Product,我只做了几个月的编程,但我已经做了研究并尝试了这段代码 我目前有2个文件。第一个包含±300万对蛋白质ID(字符串)。 第二个包含每个蛋白质的枚举列表,并为其包含的每个特征分配一个唯一的编号:即,如果蛋白质包含3个特征,它将显示为蛋白质1、蛋白质2、蛋白质3。一些蛋白质可以有多达3000个特征 我想要一个功能交互对的列表 到目前为止,我的代码是: import csv,itertools, gzip from collections import Counter #opens and reads
import csv,itertools, gzip
from collections import Counter
#opens and reads/writes files using csv and gzip
#1. Counts how many features each protein has in the second file.
cnt = Counter()
for row in cfile1:
cnt[row[0]]+=1
#2. Considers pairs of interacting proteins
for row in cfile2:
p1 = row[0]; p2=row[1]
#3.1. if both proteins have no features, just write the pair to the new file
if cnt[p1]==0 and cnt[p2]==0:
cout.writerow([p1,p2])
#3.2. if one protein has no feature, but the other has a feature write e.g. (p1_1,p2) (p1_2,p2) (p1_3,p2)... (p1_k,p2)
elif cnt[p1]!=0 and cnt[p2]==0:
x = cnt[p1]
for i in range(1,x+1):
p1n=p1+"_%d"%(i)
cout.writerow([p1n,p2])
elif cnt[p1]==0 and cnt[p2]!=0:
x = cnt[p2]
for i in range(1,x+1):
p2n=p2+"_%d"%(i)
cout.writerow([p1,p2n])
#3.3 if both proteins have features, create a list of the enumerated proteins then get the cartesian product of that list, so that you get all possible f-f interactions
elif (cnt[p1]!=0) and (cnt[p2]!=0):
x = cnt[p1];y = cnt[p2]
xprots = []; yprots=[]
for i in range(1,x+1):
p1n =p1+"_%d"%(i)
xprots.append(p1n)
for i in range(1,y+1):
p2n=p2+"_%d"%(i)
yprots.append(p2n)
for i in itertools.product(xprots,yprots):
cout.writerow([i[0],i[1]])
代码似乎工作正常,但大约需要18个小时才能通过前150000对。到目前为止,输出文件中有近20亿次交互
不管怎样,除了可能删掉一些功能外,还有没有其他可能加快这一进程的方法呢。任何提示都将不胜感激
提前感谢我认为python代码优化的可用空间很小。我可以建议你尝试在C、C++中写一个扩展,它将把计算的性能提升到更高的量级。p> 编写python扩展是一个有很好文档记录的过程,对于密集型计算应用程序来说确实非常有效 有关此问题的文档站点是:
希望有帮助 听起来这个问题是你所做的事情中固有的,即使是最快、最优化的低级C程序,这也需要非常长的时间 前15万对花了18个小时。到目前为止,输出文件中有近20亿次交互 让我们看看数字。你说有300万个蛋白质对,每个蛋白质最多可以有3000个特征。因此,输出中的总行数大约为(300万)*(3000)^2,即27万亿。看起来每行至少包含10个字符(字节),所以我们讨论的是大约270 TB的输出
我怀疑你的磁盘是否足以存储这样的文件。你需要重新思考你想做什么;即使在这段代码中改进1000倍也不会改变输出的大小,并且您的程序的速度也不会超过它所产生的大小。如果您确实需要所有这些输出,您的问题可能更适合在超级计算机或群集上进行并行计算,这将需要根据体系结构进行专门编程。请使用优化和效率类型的问题我看不出有太多的改进空间。如果您一直使用python,您可以尝试另一种解释器s.a.或。PyPy要求所有模块都兼容,但使用numba,最昂贵的函数上面的一个简单的
@autojit
可以使您的速度提高1000倍。你也可以用cython重写其中的部分内容。非常感谢@Pablo,我一定会研究的。:)谢谢你@Dan,我会和大学谈谈如何在集群中获得一席之地。