【发布时间】:2020-01-01 18:06:45
【问题描述】:
我有两个函数,其中输入 delta_E 只能是 3 个可能的值,0、4、8。我的第一个函数直接使用 numpy 的指数函数计算它。
def acceptance_prob(delta_E, beta):
return np.exp(-delta_E*beta)
而我的第二个函数创建了一个字典,预先计算了 3 个不同的值:
def acceptance_prob2(delta_E, beta):
prob = {i: np.exp(-i*beta) for i in range(0,9,4)}
return prob[delta_E]
使用魔术命令 %timeit 对两者进行基准测试返回
%timeit -n 1000000 acceptance_prob(4,5)
3.02 µs ± 13.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit -n 1000000 acceptance_prob2(4,5)
10.9 µs ± 37.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
显示预计算方法比使用 np.exp() 慢 3 倍多一点,我不明白。据我所知,计算机语言通常使用泰勒级数展开来计算指数函数,所以肯定预先计算它们并查找它们而不是计算它们每个循环更快?
【问题讨论】:
-
acceptance_prob2计算三个值,另一个只计算一次。如果你在函数之外makeprob那么函数应该更快。 -
那么我需要在我的函数之外预先计算它吗?你是说每次我使用
acceptance_prob2计算3次?我不是按照我的问题所说的那样做吗,哈哈 -
Are you saying that each time I use acceptance_prob2 it calculates 3 times?- 是。 -
如果您一次只评估一个标量值,请使用
math.exp。np.exp应该用于数组输入 - 许多值,例如np.exp(-delta_E, np.arange(0,100))。这种计算将比重复的字典查找快很多。numpy中加快速度的关键是使用编译后的数值方法,而不是 Python 级别的迭代。
标签: python performance numpy benchmarking