我发现在Numpy中计算表达式时存在奇怪的性能差异。
我执行了以下代码:
然后。
我执行了以下代码:
import numpy as np
myarr = np.random.uniform(-1,1,[1100,1100])
然后。
%timeit np.exp( - 0.5 * (myarr / 0.001)**2 )
>> 184 ms ± 301 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
并且
%timeit np.exp( - 0.5 * (myarr / 0.1)**2 )
>> 12.3 ms ± 34.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
在第二种情况下,计算速度快了近15倍!请注意,唯一的区别是因子是0.1还是0.001。
这种行为的原因是什么?我能改变什么使得第一次计算和第二次一样快吗?
exp
运算速度较慢:exp(-1)
的速度比exp(-1000)
要快。这可能是由于exp
算法在处理大数时收敛速度较慢导致的。 - Brenllaexp(1)
仍然比exp(1000)
快得多。 - Brenllaexp(-708)
是一个普通的浮点数,而exp(-709)
是非规格化数,这就是我在Mac OS X上看到执行时间大幅增加的地方。直到约exp(-746)
才会下溢为零。 - Warren Weckesser