Как я могу ускорить вложенные циклы в моей программе? - PullRequest
2 голосов
/ 09 марта 2020

Я работаю над симулятором игрового автомата. Код

Сердцем программы является вложенная l oop, подобная этой:

import pandas

for universe in range(10000):
    for spins in range(50000):
        win = paytable.Multiplier.sample(weights=paytable.Probability)
        result.append(win)

Юниверсы - это количество раз, когда процесс имитации ставок следует имитировать.

Вращения - это количество вращений, сыгранных в каждой вселенной.

Программа делает взвешенный выбор из pandas кадра данных, чтобы определить, выиграл ли вращение и сколько.

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

Я прочитал кое-что о многопроцессорной обработке и векторизации, но у меня нет Идея, насколько это применимо и с чего начать.

1 Ответ

0 голосов
/ 29 марта 2020

Вы можете распараллелить работу вашего процессора в зависимости от того, сколько у вас ядер. Допустим, у вас есть 8

import threading
import pandas

pool_semaphore = threading.BoundedSemaphore(value=8)

## Define a wrapper function that makes clear the passing of the argument and appends to some list 'result' that I will create later.
def awrapper(myarg):
    result.append(paytable.Multiplier.sample(weights = myarg))

threads = []
result = []

for universe in range(10000):
    for spins in range(50000):
        threads.append(threading.Thread(target=awrapper, args=(paytable.Probability,)))
        time.sleep(1)
        try:
            threads[-1].start()
            print(threading.active_count())
        except:
            time.sleep(1)
            print('oops. Error')
for t in threads:
    t.join()

Сейчас. Если функция patytable.Multiplier.sample достаточно проста. Возможно, вы можете распараллелить в GPU. Но это совсем другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...