并行化/加速独特的子串生成技术

2024-06-17 13:36:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用4个字符的重复来生成独特的组合(比如a、b、c和d,对于我正在编写的python脚本)。你知道吗

{Depth_value --> Output To Be Generated}

 - 1 --> [a, b, c, d]
 - 2 --> [a, b, c, d, aa, ab, ac, ad, ba, bb, bc, bd, ca, cb, cc, cd, da, db, dc, dd]
 - 3 --> [a, b, c, d, aa, ab, ac, ad, ba, bb, bc, bd, ca, cb, cc, cd, da, db, dc, dd, aaa, aab, aac, aad, ..., ddd]
 - .
 - .
 - .
 - N --> [a, b, c, d, aa, ab, ac, ad, ba, bb, bc, bd, ca, cb, cc, cd, da, db, dc, dd, aaa, aab, aac, aad, ..., (ddd...d)]

编辑1

UniquePatterns = ["".join(x) for i in range(1, depth + 1) for x in product(*['abcd'] * i)]

执行^代码不到一秒钟。我认为我对这句话的结果所做的是造成瓶颈的原因。你知道吗

depth = int(sys.argv[1])
    UniquePatterns = ["".join(x) for i in range(1, depth + 1) for x in product(*['ATCG'] * i)]
    print("Scanning dataset for" + str(len(UniquePatterns)) + " unique patterns!")

    UniqueCountPatterns = UniquePatterns
    GDS = {}
    GDS_UniqueCount = dict(zip(UniqueCountPatterns, [0 for i in range(1, NumberOf(UniqueCountPatterns)+1)]))
    GDS['UniqueCount'] = GDS_UniqueCount

    mngr = Manager()
    GDS_Links = mngr.dict()
    GDS_Links = dict(zip(UniquePatterns, [0 for i in range(1, NumberOf(UniquePatterns)+1)]))
    for l in dict(zip(UniquePatterns, [0 for i in range(1, NumberOf(UniquePatterns)+1)])):
        GDS_Links[l] = dict(zip(UniquePatterns, [0 for i in range(1, NumberOf(UniquePatterns)+1)]))

对有效地填充词典有什么建议吗?你知道吗


这就是我生成独特模式列表的方式。然而,在深度值为6之前,它的工作效率相当高,但要生成超出该值的模式,则需要花费大量时间。你知道吗

我的整个python脚本是一个高度并行化的脚本,在计算超过6的‘depth’变量值的唯一组合时花费了大量的时间,这正成为我整个过程中的一个瓶颈。你知道吗

是否有可能并行化代码,以有效地生成唯一的组合是“可接受的”时间。(在我的应用程序中,“可接受”的定义可以从几秒钟到大约1分钟不等)。你知道吗

我试图通过使用一个核心进程来并行化这个计算的某些方面,在一个进程中以如下方式使用多重处理来计算具有一定长度重复的唯一组合。你知道吗

from itertools import product, chain
from multiprocessing import Pool, Process, Manager


def logic_patterncounting(inp1):
    return ["".join(x) for x in product(*['abcd'] * inp1)]


# UniquePatterns = ["".join(x) for i in range(1, 7 + 1) for x in product(*['ATCG'] * i)]
if __name__ == '__main__':
    depth = 2
    UniquePatterns = []
    pool = Pool()
    UniquePatterns = chain(*pool.map(logic_patterncounting, range(1, depth + 1)))
    print(list(UniquePatterns))
    pool.close()
    pool.join()

这不是实现我想要的最好方法。对于较大的深度值,如何增加相同的计算?你知道吗


变通解决方案

运行一个单独的进程,不断生成独特的模式,并将它们存储在一个单独的文件中。对于较大的深度值,生成唯一模式所需的时间仍然很大,但是在主应用程序执行的时间0时这些模式的可用性修复了瓶颈。通过将文件内容读入字典或列表结构(取决于用法),对主应用程序进行编码,以利用现成的模式列表。你知道吗

另外,我不想求助于解决办法,除非没有其他解决办法。你知道吗


Tags: in脚本for时间模式rangeproductzip