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

时间:2015-08-05 03:29:41

标签: python string multiprocessing python-multiprocessing

我正在尝试生成重复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)]

EDIT1

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的“深度”变量值之外的独特组合所花费的大量时间,它将成为我整个过程中的瓶颈。

是否有可能并行化代码以有效地生成独特的组合是“可接受的”时间。 (在我的申请上下文中''accepted'的定义可以从几秒到大约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处这些模式的可用性修复了瓶颈。通过将文件内容读入字典或列表结构(取决于用法),对主应用程序进行编码,以利用现成的模式列表。

P.S。除非没有其他解决办法,否则我不想重新安排办公室。

0 个答案:

没有答案