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

时间:2010-12-07 02:51:04

标签: python lazy-evaluation ternary-operator

上下文

作为一个个人学习项目,我一直致力于一个简单的计算机代数系统。我有一个单变量多项式类,其中项的系数存储为字典。运算符重载两个多项式A和B的总和涉及找到相似的项,添加它们并为A或B中的项创建新项,但不是两者(XOR)。这按预期工作,但......

问题:

我注意到当我想添加两个多项式时,过程很慢,因为有一个可以同时完成的常见计算。例如,给定四个多项式(A,B,C,D),总和:

A + B + C + D

评估为:

((A+B) + C) + D
换句话说,

add(add(add(A,B),C),D)

我可以写一个add函数的特殊重载,当有多个求和时会调用它吗?

add(A,B,C,D)

4 个答案:

答案 0 :(得分:3)

  

我可以写一个特殊的重载吗?   要调用的add函数   什么时候有多个总结?

简而言之:否

以下是所有运算符和参数的列表:http://docs.python.org/reference/datamodel.html#emulating-numeric-types

使用自定义功能是您唯一的选择

答案 1 :(得分:2)

您是否真的对代码进行了分析,以确定您的瓶颈在哪里? python中的函数调用相当快。

答案 2 :(得分:2)

对某些黑客来说(某种程度上)是可行的......

基本上,过程是在初始计算之后不返回值 - 而是返回一个你将在某个时刻计算值的承诺。

因此a + b将返回一个表示要完成的计算的对象(但实际上没有执行计算),我称之为(+ a b)

然后,当评估下一个添加内容时,我们最终会得到(+ a b) + c,其评估结果为(+ a b c),依此类推。

只有在访问结果的属性时才实际执行计算。

答案 3 :(得分:1)

您可以使用 reduce 内置功能

像这样减少(lambda x,y:x + y,[1,2,3,4,5]) 它将计算(((((1 + 2)+3)+4)+5)。

您可以从此处获得有关它的更多信息:http://docs.python.org/library/functions.html#reduce