Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中优化大型列表笛卡尔乘积的代码_Python_Bioinformatics_Cartesian Product - Fatal编程技术网

如何在python中优化大型列表笛卡尔乘积的代码

如何在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

我只做了几个月的编程,但我已经做了研究并尝试了这段代码

我目前有2个文件。第一个包含±300万对蛋白质ID(字符串)。 第二个包含每个蛋白质的枚举列表,并为其包含的每个特征分配一个唯一的编号:即,如果蛋白质包含3个特征,它将显示为蛋白质1、蛋白质2、蛋白质3。一些蛋白质可以有多达3000个特征

我想要一个功能交互对的列表

到目前为止,我的代码是:

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,我会和大学谈谈如何在集群中获得一席之地。