【问题标题】:Implementing Multicore Threading on this algorithm在此算法上实现多核线程
【发布时间】:2011-07-24 21:20:39
【问题描述】:

我正在尝试找到一种方法来使以下算法在多个内核上进行处理,但我的观点并不好。我认为使用在多个进程之间共享的锁定迭代器并不是最有效的方式。

 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 训练。;-)

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

【问题讨论】:

  • 感谢您的编辑。我仍然没有得到 StackExchange 格式。
  • 而不是charset = sortCharset(charset),只需使用charset = sorted(set(charset))。 (不需要del _set,因为_set 是本地的。)另外,not rawraw is False 更好。
  • 谢谢,sorted(.. 很好!我一直都在倾听关于如何让代码变得更好的建议。
  • 另外,作为一般原则,不要调用变量set,因为set是内置类型,替换它只会导致混乱。
  • 我认为您可能正在寻找 itertools.permutations - 查看文档,看看它是否在做您想要的。 docs.python.org/library/itertools.html#itertools.permutations

标签: python multiprocess


【解决方案1】:

问题不在于命名风格或如何从字符串中获取一组排序好的字符。

您可能想查看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)

hack 的本质是你需要为multiprocessing 中的函数使用可腌制对象,并且只有在顶层定义的函数才能被腌制。 (使用multiprocessing.Valuemultiprocessing.Manager 可以解决此问题,但出于目前的目的,它们并不值得一试。)

这是各种运行的输出:

$ for x in map pmap imap imapu ; do time python mp.py $x; done

real    0m9.351s
user    0m9.253s
sys     0m0.096s

real    0m10.523s
user    0m20.753s
sys     0m0.176s

real    0m4.081s
user    0m13.797s
sys     0m0.276s

real    0m4.215s
user    0m14.013s
sys     0m0.236s

【讨论】:

    猜你喜欢
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2011-05-15
    • 2011-08-11
    • 2018-07-26
    相关资源
    最近更新 更多