在此算法上实现多核线程

2024-04-19 06:50:07 发布

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

我不想在算法上找到一个好的算法。我认为使用多个进程之间共享的锁迭代器不是最有效的方法。在

 def sortCharset(set):
   _set = ""
   for c in set:
     if c not in _set:
       _set += c
   set = _set
   del _set
   set = list(set)
   set.sort()
   return "".join(set)
 
 
 def stringForInt(num, set, length):
   setLen = len(set)
   string = ""
   string += set[num % setLen]
   for n in xrange(1,length):
     num //= setLen
     string += set[num % setLen]
   return string
 
 
 def bruteforce(set, length, raw = False):
   if raw is False:
     set = sortCharset(set)
 
   for n in xrange(len(set) ** length):
     yield stringForInt(n, set, length)

简短说明: 代码用于创建所有可能的组合 从一组字符,即破解密码。 (当然不是我的本意,只是一些Py训练。;—)

在多核上运行此算法的好方法是什么?


Tags: 方法in算法forstringlenreturnif
1条回答
网友
1楼 · 发布于 2024-04-19 06:50:07

问题其实并不是关于命名样式或如何从字符串中获取一组经过排序的字符。在

您可能需要查看multiprocessing模块。我几乎是一个n00b w/r/t多核并行,但有一些工作要做:

import multiprocessing, itertools

def stringForInt(args):
    num, charset, length = args ## hack hack hack
    setlen = len(charset)
    s = []
    s.append(charset[num % setlen])
    for n in xrange(1, length):
        num //= setlen
        s.append(charset[num % setlen])
    return ''.join(s)

def bruteforce(charset, length, mapper, raw=False):
    if not raw:
        charset = sorted(set(charset))
    return mapper(stringForInt, ((n,charset,length) for n in xrange(len(charset)**length)))

if __name__ == '__main__':
    import time, sys
    if len(sys.argv) == 1 or sys.argv[1] == 'map':
        mapper = map
    else:
        p = multiprocessing.Pool()
        pfunc = {'pmap':p.map,
                 'imap':p.imap,
                 'imapu':p.imap_unordered}[sys.argv[1]]
        mapper = lambda f, i: pfunc(f, i, chunksize=5)
    o = bruteforce('abcdefghijk',6,mapper)
    if not isinstance(o, list):
        list(o)

黑客的本质是您需要为multiprocessing中的函数使用pickle对象,并且只有在顶层定义的函数才能被pickle。(使用multiprocessing.Valuemultiprocessing.Manager还有其他方法来解决这个问题,但它们实际上不值得在目前的情况下使用。)

以下是各种运行的输出:

^{pr2}$

相关问题 更多 >