4

问候,

我不确定这是否是一个愚蠢的问题。

假设我有 3 个 numpy 数组 A1、A2、A3 和 3 个浮点数 c1、c2、c3

我想评估 B = A1*c1+ A2*c2+ A3*c3

例如,numpy 会计算这个,

 E1 = A1*c1
 E2 = A2*c2
 E3 = A3*c3
 D1 = E1+E2
 B = D1+E3

还是比这更聪明?在 c++ 中,我有一种巧妙的方法来抽象这种操作。

我定义了一系列通用的“LC”模板函数,用于线性组合的 LC,例如:

template<class T,class D>
void LC( T & R,
    T & L0,D C0,
    T & L1,D C1,
    T & L2,D C2)
{
    R = L0*C0
        +L1*C1
        +L2*C2;        
}

然后将其专门用于各种类型,

例如,对于一个数组,代码看起来像

for (int i=0; i<L0.length; i++)
    R.array[i] =
    L0.array[i]*C0 +
    L1.array[i]*C1 +
    L2.array[i]*C2;

从而避免必须创建新的中间数组。

这可能看起来很乱,但效果很好。

我可以在 python 中做类似的事情,但我不确定它是否需要。

提前感谢您的任何见解。-缺口

4

2 回答 2

7

虽然numpy理论上,它可以随时升级其内部以执行奇妙的优化,但目前它不会:B = A1*c1 + A2*c2 + A3*c3确实会产生然后丢弃中间临时数组(当然,“花费”一些辅助内存 - 没有别的) .

B = A1 * c1紧随其后B += A2 * c2; B += A3 * c3,此时再一次,会因此避免消耗一些暂时的记忆。

当然,只有在实际内存稀缺的环境中运行(其中一些辅助内存只是虚拟的并导致页面错误)并且有足够大的数组来“花费”时,您才能分辨出差异所有真实的记忆,然后一些。然而,在如此极端的条件下,一些重构可以为您带来一些性能。

于 2010-05-30T05:46:31.423 回答
3

这就是numexpr(A Fast numeric array expression evaluator for Python and NumPy)背后的想法。在编译您自己的例程之前,您可以尝试一下这个包。

于 2010-05-30T12:06:47.790 回答