我试图在python中实现一个简单的蛮力方法,以使用内置的库函数搜索字符串模式。这是代码
from itertools import product
from multiprocessing import Pool
import time
import numpy as np
chars=np.array(['a','b','c','d', 'e', 'f', 'g', 'h', 'i', 'j'])
password='cgbjfifac'
min_length=1
max_length=9
def brute_force():
for length in range(min_length, max_length + 1):
for p in product(chars, repeat=length):
guess = ''.join(p)
if guess == password:
return guess
在双核英特尔® 至强(R( CPU @ 2.30GHz 机器上大约需要87 秒。
我已经尝试过使用python中的标准库的多处理方法(即使用池和映射方法(;但它没有提供任何加速。
我们如何进一步提高这种方法的性能。 (理想情况下,输入的长度为>= 10(
参考:堆栈溢出
我拿出了numpy并删除了".join,加快了~x3。
from itertools import product
from multiprocessing import Pool
import time
start_time = time.time()
chars=['a','b','c','d', 'e', 'f', 'g', 'h', 'i', 'j']
password=tuple('cgbjfifac')
min_length=1
max_length=9
def brute_force():
for length in range(min_length, max_length + 1):
for p in product(chars, repeat=length):
if p == password:
return p
brute_force()
print(time.time()-start_time)
这是一个稍微好一点的代码版本,使用多处理...
from itertools import product
from multiprocessing import Pool
import time
chars=['a','b','c','d', 'e', 'f', 'g', 'h', 'i', 'j']
password=tuple('cgbjfifac')
min_length=1
max_length=9
def parallel_brute_force(length):
for p in product(chars, repeat=length):
if p == password:
return p
tick=time.time()
with multiprocessing.Pool(multiprocessing.cpu_count()) as p:
for v in p.imap_unordered(parallel_brute_force, range(min_length, max_length + 1):
result=v
print("Time :" + str(time.time()-tick) + " s")
print(result)
在 23 核 17GHz 机器上的时间从 4 秒减少到 2.0 秒......!!提高 1.3 倍
裁判:-
Python:imap/imap_unordered 和 map/map_async 之间的区别
罗塞塔码:并行蛮力