Python- ¿Cómo hacer que este progtwig use multiprocesamiento?

En Python 3, tengo un progtwig de rodillo de dados simple. Lo que hace es pedirle al usuario la cantidad de lados de un dado y cuántas veces les gustaría tirarlo.

Esto se logra creando una lista y cada sublista representa un lado del dado. Cada vez que se genera un número aleatorio, se anexa a la sublista correspondiente.

Los resultados se muestran con un sencillo procedimiento de impresión.

Mi consulta es cómo puedo usar el multiprocesamiento para hacerlo más rápido, ya que toma ~ 21 minutos hacer 1 millón de tiradas.

El código para el progtwig es el siguiente:

import time import random roll = []#List for the results def rng(side,reps):#rolls the dice for i in range(reps): land = random.randint(1,side) print(land) roll[land-1].append(land) def printR(side,reps):#Prints data for i, item in enumerate(roll): print('D'+str(i+1),'=''total ',total) def Main(): side = int(input('How many sides is the dice')) reps = int(input('How many rolls do you want to do?')) for i in range(side):#Creates empty arrays corresponding to amount of sides roll.append([]) t0= time.clock()#Start timing dice roller rng(side,reps) t1 = time.clock()#End timing of dice roller printR(side,reps)#Print data times = t1 - t0#Time print(round(times,3),'seconds') Main() 

No necesitas multiprocesamiento. Todo lo que necesitas hacer es usar un mejor algoritmo.

 >>> import collections >>> import random >>> import time >>> def f(): ... t = time.perf_counter() ... print(collections.Counter(random.randint(1,6) for _ in range(1000000))) ... print(time.perf_counter() - t) ... >>> f() Counter({2: 167071, 4: 166855, 3: 166681, 1: 166678, 5: 166590, 6: 166125}) 2.207268591399186 

Elegir el algoritmo alternativo es probablemente el mejor plan, pero para lo que vale la pena, si desea utilizar el multiprocesamiento, probablemente tenga un problema diferente que resolver. Por ejemplo, digamos que tienes una lista de listas de números.

 nums = [[1,2,3],[7,8,9],[4,5,6]] 

Entonces podría tener una función por sub-lista que tal vez calcula y devuelve la sum de los números en el sub-conjunto. Agregue los resultados para obtener la sum total, probablemente más rápido de lo que lo haría con un conjunto de datos suficientemente grande. También podría tener una ordenación por combinación multiprogtwigción, por ejemplo. La multiprogtwigción / subprocesamiento es mejor cuando tiene una serie de tareas que no interfieren entre sí y se pueden completar de forma aislada.

Para su problema original, probablemente tendría que pensar en cómo realizar un seguimiento del total de rollos por lado para poder tener una función por lado calculando rollos, pero luego estaría el problema habitual de averiguar cómo asegurarse de que los contadores sean consistentes / Cómo saber cuándo parar.