这是一个运行速度快约75倍并实现相同功能的版本:
def generate_times_opt(rate_function,max_t,delta):
t = numpy.arange(delta,max_t, delta)
avg_rate = (rate_function(t) + rate_function(t + delta)) / 2.0
avg_prob = 1 - numpy.exp(-avg_rate * delta / 1000.0)
rand_throws = numpy.random.uniform(size=t.shape[0])
return t[avg_prob >= rand_throws].tolist()
输出:
11:59:07 [70]: %timeit generate_times(rate_function, max_t, delta)
10 loops, best of 3: 75 ms per loop
11:59:23 [71]: %timeit generate_times_opt(rate_function, max_t, delta)
1000 loops, best of 3: 1.15 ms per loop
旁注:不过,这不是模拟非均匀泊松过程的最佳方法.从Wikipedia开始:
An inhomogeneous Poisson process with intensity function λ(t) can be simulated by rejection sampling from a homogeneous Poisson process with fixed rate λ: choose a sufficiently large λ so that λ(t) = λ p(t) and simulate a Poisson process with rate parameter λ. Accept an event from the Poisson simulation at time t with probability p(t).