nic*_*ell 2 python arrays numpy linear-algebra
问候,
我不确定这是不是一个愚蠢的问题.
假设我有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
Run Code Online (Sandbox Code Playgroud)
还是比这更聪明?在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;
}
Run Code Online (Sandbox Code Playgroud)
然后将其专门用于各种类型,
例如,对于数组代码看起来像
for (int i=0; i<L0.length; i++)
R.array[i] =
L0.array[i]*C0 +
L1.array[i]*C1 +
L2.array[i]*C2;
Run Code Online (Sandbox Code Playgroud)
从而避免必须创建新的中间阵列.
这可能看起来很乱,但效果确实很好.
我可以在python中做类似的事情,但我不确定它是否是必需的.
提前感谢您的任何见解.-缺口
虽然numpy
理论上可以在任何时候总是升级其内部以进行奇妙的优化,但目前它还没有:B = A1*c1 + A2*c2 + A3*c3
确实会产生然后丢弃中间临时数组("花费"一些辅助内存,当然 - 没有别的) .
B = A1 * c1
然后B += A2 * c2; B += A3 * c3
,在此时再次,将避免花费一些临时记忆.
当然,只有当你在一个实际内存稀缺(其中一些辅助内存只是虚拟并导致页面错误)和足够大的数组"花费"的环境中运行时,你才能区分它们.所有真正的记忆然后一些.然而,在如此极端的条件下,一点点重构可以为你带来一些性能.