【发布时间】:2014-02-02 01:48:11
【问题描述】:
我正在用 numpy. 此代码将位于最内层循环中,计算的运行时间以小时为单位。 快速计算表明,在某些计算变体中,此代码将被执行大约 10^12 次。
所以这个函数是计算 sigmoid(X) 和另一个计算它的导数(梯度)。
Sigmoid 具有
y=sigmoid(x), dy/dx= y(1-y)
在 python for numpy 中,这看起来像:
sigmoid = vectorize(lambda(x): 1.0/(1.0+exp(-x)))
grad_sigmoid = vectorize(lambda (x): sigmoid(x)*(1-sigmoid(x)))
可以看出,这两个函数都是纯函数(没有副作用), 所以它们是记忆的理想人选, 至少在短期内,我担心缓存每一次对 sigmoid 的调用:存储 10^12 个浮点数,这将占用几 TB 的 RAM。
有什么好的方法可以优化吗?
python 是否会发现这些是纯函数并酌情为我缓存它们?
我什么都不担心吗?
【问题讨论】:
-
请注意,
1/(1+np.exp(-x))已经接受 numpy 数组作为输入,而且速度非常快(我猜记忆化根本没有帮助)。通过使用vectorize,它会变得更慢,因为它是使用慢 for 循环实现的。 -
x 的大小是多少?
-
@M4rtini,不同,但我一直假设我的 tumb 计算规则,x 通常是长度为 100 的向量。
标签: python numpy optimization memoization blas