Python中__add__的三元(及更多)重载

2 投票
4 回答
739 浏览
提问于 2025-04-16 08:09

背景:

我在做一个个人学习项目,正在开发一个简单的计算机代数系统。我有一个单变量多项式的类,其中每个项的系数是用字典来存储的。当我想把两个多项式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),依此类推。

只有当你访问结果的某个属性时,才会真正进行计算。

撰写回答