[英]Implementing Multicore Threading on this algorithm
我正試圖找到一種方法來在多個內核上處理以下算法,但我沒有找到一個好點。 使用在多個進程之間共享的鎖定迭代器不是我認為最有效的方法。
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訓練。;-)
在多個內核上運行此算法的好方法是什么?
問題不在於命名樣式或如何從字符串中獲取一組有序字符。
您可能想要查看多處理模塊。 我幾乎是一個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
的函數使用pickleable對象,並且只能在頂層定義的函數進行pickle。 (還有其他方法可以使用multiprocessing.Value
或multiprocessing.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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.