所以我尝试过我尝试计算下面数字的数百万种不同的组合,但我每秒只计算大约1,750种组合,甚至没有接近我需要的速度。那么我将如何重塑这一点,以便同一事物的多个过程计算不同的部分,而不计算已经计算过的部分并保持快速的速度?下面的代码部分是我一直在使用的。任何例子都将不胜感激!
from itertools import product
for chars in product("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12234567890!@#$%^&*?,()-=+[]/;", repeat = 4):
print chars
答案 0 :(得分:7)
将产品分解为多个部分的一种方法是分解产品的第一个组件,以便每个独立的工作都具有以一组首字母开头的所有元素。例如:
import string
import multiprocessing as mp
import itertools
alphabet = string.ascii_letters+string.digits+"!@#$%^&*?,()-=+[]/;"
num_parts = 4
part_size = len(alphabet) // num_parts
def do_job(first_bits):
for x in itertools.product(first_bits, alphabet, alphabet, alphabet):
print(x)
if __name__ == "__main__":
pool = mp.Pool()
results = []
for i in xrange(num_parts):
if i == num_parts - 1:
first_bit = alphabet[part_size * i :]
else:
first_bit = alphabet[part_size * i : part_size * (i+1)]
results.append(pool.apply_async(do_job(first_bit)))
pool.close()
pool.join()
(显然,如果results
实际返回了某些内容,您只会使用do_job
。
答案 1 :(得分:1)
你确定你每秒只能得到1750个组合吗?我得到了大约1000万。
def test(n):
start = time.time()
count = 0
for chars in product("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12234567890!@#$%^&*?,()-=+[]/;", repeat = 4):
count += 1
if count == n: break
return time.time() - start
>>> test(10000)
0.03300023078918457
>>> test(1000000)
0.15799999237060547
>>> test(10000000)
1.0469999313354492
我认为我的电脑 。
注意:我发布了这个作为答案,因为我想显示代码。这真的是一个评论。所以请,没有赞成或反对。