优化 python 中的蛮力算法



我试图在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 倍

裁判:-

  1. Python:imap/imap_unordered 和 map/map_async 之间的区别

  2. 罗塞塔码:并行蛮力

相关内容

  • 没有找到相关文章

最新更新