正如@Divakar所建议的那样,用只知道标量的math.exp
替换为也知道ndarray
的numpy.exp
是正确的方法。
另外一些基准测试:
in_img = numpy.random.random((1000, 1000))
在CPython中:
%timeit (1 / (1 + numpy.exp(-in_img[:,:])))
执行10次,3次取最佳结果:每次循环耗时51.1毫秒。
使用numexpr:
import numexpr
%timeit numexpr.evaluate("1 / (1 + exp(-in_img))")
10 loops, best of 3: 27.9 ms per loop
使用Numba(假设您已经像下面这样正确注释了函数)
import numpy
from numba import vectorize, float64
@vectorize([float64(float64)])
def f(x):
return 1 / (1 + numpy.exp(-x))
你将得到:
%timeit f(in_img)
100 loops, best of 3: 5.34 ms per loop
使用Pythran(假设您已编译以下功能)
def f(in_img):
return 1 / (1 + numpy.exp(-in_img[:,:]))
使用以下命令进行编译:
pythran f.py -DUSE_BOOST_SIMD -march=native
并且测试它:
100 loops, best of 3: 5.07 ms per loop
math.exp
替换为np.exp
。 - Divakar