Я пытался улучшить свой код (с помощью numba и многопроцессорности), но у меня не получается, потому что у моей функции много аргументов.
Я уже упростил его другими функциями (см. ниже)...
Поскольку каждый агент (экземпляр класса) не зависит друг от друга для этих действий, я хотел бы заменить for
на Pool
.
Так что я бы получил большую функцию pooling()
, которую я бы вызвал и передал список агентов
from multiprocessing import Pool
p = Pool(4)
p.map(pooling, list(agents))
Но где мне ДОБАВИТЬ все аргументы, которые потребуются функции объединения?
As it is:
def check_demographics(month, my_agents, families, firms, year, mortality_men, mortality_women, fertility, state_id):
dummy = list(my_agents)
d = str(state_id.iloc[0])
# Place where I would like to replace the LOOP. All below would be a function
for agent in dummy:
if agent.get_region_id()[:2] == d:
# Brithday
if month % 12 == agent.month - 1:
agent.update_age()
# Mortality probability
if agent.get_gender() == 'Male':
prob = mortality_men[mortality_men['age'] == agent.get_age()][year].iloc[0]
# When gender is Female
else:
# Extract specific agent data to calculate mortality 'Female'
prob = mortality_women[mortality_women['age'] == agent.get_age()][year].iloc[0]
# Give birth decision
age = agent.get_age()
if 14 < age < 50:
pregnant(agent, fertility, year, families, my_agents)
# Mortality procedures
if fixed_seed.random() < prob:
mortal(my_agents, my_graveyard, families, agent, firms)
Это самая трудоемкая функция в моей программе. И @jit
мало чем помогает.
Огромное спасибо
my_graveyard
отсутствует. - person Laurent LAPORTE   schedule 05.07.2016