Вопрос на самом деле не в стиле именования или в том, как извлечь отсортированный набор символов из строки.
Возможно, вы захотите заглянуть в модуль 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
, и только функции, которые определены на верхнем уровне, могут быть активированы. (Существуют и другие способы обойти это, используя 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