In my experience, the np.random.exponential(a) function is slower than the (presumably) equivalent 1/a * np.log(1/np.random.uniform(0,1)) approach for generating exponentially distributed random numbers. This is a little strange and bears further inspection (e.g. maybe the latter approach has some bad behavior in the extremes). Regardless we should pick the best (fastest while still accurate) approach.