上下文
作为一个个人学习项目,我一直致力于一个简单的计算机代数系统。我有一个单变量多项式类,其中项的系数存储为字典。运算符重载两个多项式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)
答案 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