3
我正試圖優化放射性同位素蒙特卡羅衰變時間的產生。 給出了nsims
同位素原子,其半衰期爲t12
,每個同位素衰變何時發生? 我試圖通過使用單個numpy.random.random
調用(我稱這種方法並行)爲所有未衰減的原子一次生成隨機數來優化這一點,但我希望還有更多的性能可以獲得。我還展示了一種爲每種同位素分別進行計算的方法(系列)。Python/Numpy - 加速放射性衰變的蒙特卡洛方法
import numpy as np
import time
import matplotlib.pyplot as plt
import scipy.optimize
t12 = 3.1*60.
dt = 0.01
ln2 = np.log(2)
decay_exp = lambda t,A,tau: A * np.exp(-t/tau)
def serial(nsims):
sim_start_time = time.clock()
decay_time = np.zeros(nsims)
for i in range(nsims):
t = dt
while decay_time[i] == 0:
if np.random.random() > np.exp(-ln2*dt/t12):
decay_time[i] = t
t += dt
sim_end_time = time.clock()
return (sim_end_time - sim_start_time,decay_time)
def parallel(nsims):
sim_start_time = time.clock()
decay_time = np.zeros(nsims)
t = dt
while 0 in decay_time:
inot_decayed = np.where(decay_time == 0)[0]
idecay_check = np.random.random(len(inot_decayed)) > np.exp(-ln2*dt/t12)
decay_time[inot_decayed[np.where(idecay_check==True)[0]]] = t
t += dt
sim_end_time = time.clock()
return (sim_end_time - sim_start_time,decay_time)
我感興趣的執行比parallel
函數是純Python更好的任何建議,即不是用Cython。 這種方法已經在serial
大nsims
計算這個方法已經大大改善。
謝謝你的建議,偉大的作品! – bungernut 2014-12-05 04:36:00