¿Cómo puedo “multiprocesar” el módulo del producto itertools?

Así que intenté. Intenté calcular millones y millones de combinaciones diferentes de la siguiente cadena, pero solo estaba calculando aproximadamente 1,750 combinaciones por segundo, lo cual no está ni cerca de la velocidad que necesito. Entonces, ¿cómo podría reformular esto para que múltiples procesos de la misma cosa estén calculando diferentes partes, mientras que no calculen partes que ya se hayan calculado y también mantengan velocidades rápidas? El código de abajo es parcialmente lo que he estado usando. Cualquier ejemplo sería apreciado!

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

Related of "¿Cómo puedo “multiprocesar” el módulo del producto itertools?"

Una forma de dividir el producto en partes es dividir el primer componente del producto, de modo que cada trabajo independiente tenga todos los elementos comenzando con un determinado conjunto de primeras letras. Por ejemplo:

 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() 

(donde obviamente solo do_job results si do_job devolviera algo).

¿Estás seguro de que solo obtienes 1750 combinaciones por segundo? Estoy recibiendo unos 10 millones.

 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 

No creo que mi computadora sea mucho más rápida que la tuya.

nota: publiqué esto como respuesta porque quería mostrar el código. Es realmente más de un comentario. Así que por favor, no hay upvotes o downvotes.