Python中__add__的三元(及更多)重载
背景:
我在做一个个人学习项目,正在开发一个简单的计算机代数系统。我有一个单变量多项式的类,其中每个项的系数是用字典来存储的。当我想把两个多项式A和B相加时,我需要找到相同的项,把它们加起来,然后为A或B中存在但在另一个中不存在的项创建一个新项(也就是异或操作)。这个过程按预期工作,但……
问题:
我发现当我想要加多个多项式时,处理速度很慢,因为有一些计算可以同时进行。例如,给定四个多项式(A、B、C、D),它们的和:
A + B + C + D
被计算为:
((A+B) + C) + D
换句话说:
add(add(add(A,B),C),D)
我能否写一个特别的加法函数重载,当有多个多项式相加时调用它?
add(A,B,C,D)
4 个回答
2
你有没有真的分析过你的代码,找出瓶颈在哪里?在Python中,函数调用的速度其实是挺快的。
3
我可以写一个特别的重载版本的add函数,让它在进行多次加法时被调用吗?
简单来说:不可以
这里有所有运算符和参数的列表:http://docs.python.org/reference/datamodel.html#emulating-numeric-types
使用自定义函数是你唯一的选择
2
这其实是可以做到的,只不过需要一些小技巧...
基本上,这个过程是这样的:在最开始计算的时候,不直接返回一个值,而是返回一个承诺,表示你会在某个时候计算出这个值。
所以,当你写 a + b
的时候,它会返回一个对象,这个对象代表着要进行的计算(但实际上并没有执行计算),我称之为 (+ a b)
。
接下来,当你要计算下一个加法时,就变成了 (+ a b) + c
,这时会变成 (+ a b c)
,依此类推。
只有当你访问结果的某个属性时,才会真正进行计算。