我如何"多处理"itertools产品模块?

Noa*_*h R 6 python multithreading python-itertools

所以我试过尝试计算下面数字的数百万和数百万种不同的组合,但我每秒只计算大约1,750种组合,甚至没有接近我需要的速度.那么我将如何重塑这一点,以便同一事物的多个过程计算不同的部分,而不计算已经计算过的部分并保持快速的速度?下面的代码部分是我一直在使用的.任何例子将不胜感激!

from itertools import product
for chars in product("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12234567890!@#$%^&*?,()-=+[]/;", repeat = 4):
   print chars
Run Code Online (Sandbox Code Playgroud)

Dou*_*gal 8

将产品分解为多个部分的一种方法是分解产品的第一个组件,以便每个独立的工作都具有以一组首字母开头的所有元素.例如:

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()
Run Code Online (Sandbox Code Playgroud)

(显然你只会resultsdo_job实际返回的东西时使用).

  • @NoahR我打赌你在Windows上,对吗?`multiprocessing`实际上是在Windows上导入模块,而不是像我这样的Unix操作系统,而不会发生这种情况,因此池中的每个元素都会产生自己的池.尝试使用`__main__`检查新版本. (2认同)