String 关于字符串统计的python多处理

String 关于字符串统计的python多处理,string,multiprocessing,String,Multiprocessing,我的文件格式如下: 45 TCGGCGCAGCGTTAGGATTAG 44 TTTCATCTGCCGCCGTTGCCG 43 CGTTTTCGGATGGATCATTGT 43 CTTGCGACGCATTTGGATCAG 35 CCGATTGCTAATCGGCAGTTG 32 TCGCGGTATCCGTCTCTTAAT 31 TTTAATGCTAAGACTACGTGG 31 TTGTGGGTGCATCAGGATTTG 31 ACTTGGCTGGCTAATGTGCA

我的文件格式如下:

45  TCGGCGCAGCGTTAGGATTAG 44    TTTCATCTGCCGCCGTTGCCG
43  CGTTTTCGGATGGATCATTGT 43    CTTGCGACGCATTTGGATCAG
35  CCGATTGCTAATCGGCAGTTG 32    TCGCGGTATCCGTCTCTTAAT
31  TTTAATGCTAAGACTACGTGG 31    TTGTGGGTGCATCAGGATTTG
31  ACTTGGCTGGCTAATGTGCAG 31    CGTTCTCTGCGGATTTATCAG
31  TCGCCGACGCCTTATTGTAAT 30    ACGAAGCCTTAGTGGATGCTT
15  ACGATGATGATGCCTCATCTT 3     ATTACTGAGCTTAAGGCGAAG
它有1000万行,第一列是事件,第二列是DNA序列。我想先把DNA翻译成肽。然后我要计算7个位置20个氨基酸的总出现率(列),6个位置400个氨基酸对的总出现率,5个位置8000个氨基酸三聚体的总出现率,以及4个位置160000个氨基酸对的总出现率。 这是我的密码:

#!/usr/bin/env python
#!/usr/bin/env python
def fre(aa,cn):
    import numpy as np
    m=len(aa)
    position_monomer=np.zeros((m,7))
    position_dimer=np.zeros((m,6))
    position_trimer=np.zeros((m,5))
    position_tetramer=np.zeros((m,4))
    fre_monomer=np.zeros((20,7))
    fre_dimer=np.zeros((400,6))
    fre_trimer=np.zeros((8000,5))
    fre_tetramer=np.zeros((160000,4))
    aa_default=['A','C','D','E','F','G','H','I','K','L','M','N','P','Q','R','S','T','V','W','Y']
    for i in xrange(m):
        for j in xrange(7):
            position_monomer[i][j]=aa_default.index(aa[i][j])
            fre_monomer[position_monomer[i][j]][j]=fre_monomer[position_monomer[i][j]][j]+cn[i]

    for i in xrange(m):
        for j in xrange(6):
            position_dimer[i][j]=20*aa_default.index(aa[i][j])+aa_default.index(aa[i][j+1])
            fre_dimer[position_dimer[i][j]][j]=fre_dimer[position_dimer[i][j]][j]+cn[i]

    for i in xrange(m):
        for j in xrange(5):
            position_trimer[i][j]=400*aa_default.index(aa[i][j])+20*aa_default.index(aa[i][j+1])+aa_default.index(aa[i][j+2])
            fre_trimer[position_trimer[i][j]][j]=fre_trimer[position_trimer[i][j]][j]+cn[i]

    for i in xrange(m):
        for j in xrange(4):
            position_tetramer[i][j]=8000*aa_default.index(aa[i][j])+400*aa_default.index(aa[i][j+1])+20*aa_default.index(aa[i][j+2])+aa_default.index(aa[i][j+3])
            fre_tetramer[position_tetramer[i][j]][j]=fre_tetramer[position_tetramer[i][j]][j]+cn[i]

    return fre_monomer,fre_dimer,fre_trimer,fre_tetramer 

#!/usr/bin/env python
#!/usr/bin/env python
from __future__ import division
import numpy as np
from Position import fre
from Xdelete import X_delete
from Bio.Seq import translate
import time

start=time.clock()
textfile = open(r"C:\Users\Shangyang Li\Desktop\FINAL 8 DATA SETS\illumina_phd7_allseqs.txt","r")

data = []
copy_number=[]
DNA=[]
peptide=[]

for line in textfile:
    data.append(line.split())

for row in range(len(data)):
    copy_number.append(int(data[row][0]))
    DNA.append(data[row][1])

peptide=[translate(line) for line in DNA]
(peptides,copy_numbers)=X_delete(peptide,copy_number)

(fre_monomer,fre_dimer,fre_trimer,fre_tetramer)=fre(peptides,copy_numbers)

但我想尽快得到单体、二聚体、三聚体、四聚体的频率,现在是30分钟到1000万数据大小。我想使用多处理来处理这个问题,但我不知道如何使用它。

尝试组合一些循环。如果两个外循环进行完全相同的迭代,则组合它们的内循环以避免外循环:

for i in xrange(m):
    for j in xrange(7):
        ....

for i in xrange(m):
    for j in xrange(6):
        ....
变成:

for i in xrange(m):
    for j in xrange(7):
        ....
    for j in xrange(6):
        ....

另外,看看是否可以避免一些
index()
调用,因为它们通常需要在引擎盖下的整个列表中进行迭代。

明白了。但我认为这还不够快。我可以用多重处理来处理吗?当然可以。一旦主线程读入数据,就可以启动线程来计算每个单独的统计数据。快速搜索会得到很多有用的结果。你能给我一些关于代码的提示吗,我已经在谷歌上搜索过了,仍然不知道……我如何避免索引,这是我找到的唯一方法……二聚体三聚体和四聚体。