The simulation function we're running could easily be run in parallel. That's
why memo also has a Runner
class available.
import numpy as np
from memo import memlist, grid, Runner
data = []
@memlist(data=data)
def birthday_experiment(class_size, n_sim=1000):
"""Simulates the birthday paradox. Vectorized = Fast!"""
sims = np.random.randint(1, 365 + 1, (n_sim, class_size))
sort_sims = np.sort(sims, axis=1)
n_uniq = (sort_sims[:, 1:] != sort_sims[:, :-1]).sum(axis = 1) + 1
return {"est_prob": np.mean(n_uniq != class_size), "number": 42}
settings = grid(
class_size=range(2, 100),
n_sim=[1_000, 10_000, 100_000]
)
Runner(backend="threading", n_jobs=4).run(birthday_experiment, settings)
This Runner
class will allow us to run jobs in parallel but it will also give us a
nifty little progress bar.