-1

В python 3 у меня есть простая программа для ролика в кости. Что он делает, так это спрашивать у пользователя количество сторон кости и сколько раз они хотели бы свернуть его.Python. Как сделать эту программу многопроцессорной?

Это достигается путем создания списка, и каждый подсписок представляет собой сторону кости. Каждый раз, когда генерируется случайное число, оно добавляется к соответствующему подсписку.

Результаты отображаются с простой процедурой печати.

Мой запрос заключается в том, как я могу использовать многопроцессорную обработку, чтобы сделать ее быстрее, поскольку требуется 1 миллион рулонов.

Код программы выглядит следующим образом:

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

«Добавить функцию в мою программу» не вопрос. – TigerhawkT3

+0

Кроме того, сохранение каждого рулона для результата типа [[], [2, 2, 2], [3, 3], [], [5], [6]] кажется бессмысленным. Почему бы не сохранить количество каждого результата вместо этого, например '[0, 3, 2, 0, 1, 1]'? – TigerhawkT3

+0

(Прочитайте документы, просмотрите несколько видео) repeat; попытаться что-то реализовать; вернитесь с конкретными вопросами. – wwii

ответ

0

Вам не нужно мультипроцессирование. Все, что вам нужно сделать, это использовать лучший алгоритм.

>>> 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 
0

Выбор альтернативного алгоритма, вероятно, лучший план, но для чего это стоит, если вы действительно хотели использовать многопроцессорность, вы, вероятно, иметь другую проблему решить. Например, допустим, у вас есть список списков чисел.

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

Тогда вы могли бы иметь функцию за подсписком что, возможно, вычисляет и возвращает сумму чисел в подмножестве. Совокупность результатов для получения полной суммы, вероятно, быстрее, чем в противном случае с достаточно большим набором данных. Например, у вас может быть сортировка с использованием мультипрограммирования. Многопрограммирование/нарезка лучше всего, когда у вас есть ряд задач, которые не мешают друг другу и могут выполняться изолированно.

Для вашей первоначальной проблемы вам, вероятно, придется подумать о том, как отслеживать общие броски на каждую сторону, чтобы вы могли иметь функцию на боковые расчетные ролики, но тогда будет обычная проблема в том, как сделать уверенные счетчики согласуются/как знать, когда остановиться.