2010-12-07 14 views
2

コンテキスト:私は、単純な数式処理システムに取り組んできた個人的な学習プロジェクトとして三元(!そしてもっと)過負荷

。私は単変量多項式クラスを持ち、その項に対する係数は辞書として格納されます。 2つの多項式AとBの和に負担をかけるオペレータは、同様の用語を見つけ、それらを追加し、AまたはBの項に新しい項をつけますが、どちらもXORではありません。これは期待通りに動作しますが...

質問:私は同時に行うことができる一般的な計算があるような処理が遅いより、2つの多項式を追加したいとき

私は気づきました。例えば、所与4つの多項式(A、B、C、D)の合計:

A + B + C + D 

が評価されるよう:

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

私は書くことができる:言い換える

((A+B) + C) + D 

複数の集計があるときに呼び出されるadd関数の特別なオーバーロード?

add(A,B,C,D) 

答えて

2

(一種の)カスタム関数を使用してhttp://docs.python.org/reference/datamodel.html#emulating-numeric-types

ですハッキングする...

基本的に、プロセスは最初の計算後に値を返さないことですが、何らかのpoで値を計算するという約束を返すことですint。

したがってa + bは、実行する計算を表すオブジェクトを返します(実際には計算を実行しません)。(+ a b)と呼びます。

次に、次の加算を評価すると、最終的に(+ a b) + cとなり、それは(+ a b c)と評価されます。

結果のプロパティにアクセスしたときにのみ、実際に計算が実行されます。

+0

これは何かと呼ばれていますか?私は自分自身を改革する前に車輪のいくつかの例を見たいと思います。私の推測はある種の怠惰な評価ですが、それは一般的な概念で検索に役立つことです。 – Hooked

+0

@Hooked:基本的には怠惰な評価です。申し訳ありませんが、良い例はありません。ハスケルのような怠惰な言葉がどのようにして実装されているかを調べるのが最善の策だと思います。 –

2

実際にボトルネックがどこにあるかを特定するコードをプロファイリングしましたか? Pythonの関数呼び出しはかなり高速です。

+0

ボトルネックは、次のために再びそれらを解凍だけに、バックアップそれらを梱包、そのコンポーネント用語への多項式を「開梱」であることを私は疑うだろう追加します。 –

+0

Anonは正しいですが、私は意図的に質問をより一般的なものにするコードの投稿を避けました。私はプロセスが特定のインスタンスを実装する方法ではなく、可能かどうかを知りたいと思います。 – Hooked

3

は、私は、複数の総和がある場合 呼び出されます 追加機能の特殊な過負荷を書きませんか?要するに

:ここではありません

は、すべての演算子とパラメータのリストです:一部でなんとかあなたの唯一のオプションにです

+1

素敵な 'Polynomial'クラスがあれば、それを静的メソッド' Polynomial.add'として実装することができます。 –

1

このような組み込み関数

を低減を使用することができる減らす(ラムダX、Y、X + Y、[1、2、3、4、5]) をします計算(( ((1 + 2)+3)+4)+5)となる。

あなたがここから得ることができ、それについての

の詳細情報:http://docs.python.org/library/functions.html#reduce

+0

Reduceは、少なくともこの場合、1 + 2 + 3 + 4 + 5というステートメントと同じです。私が探しているのは、連鎖した集計があるときに呼び出される別の関数です(バイナリではありません)。 – Hooked

関連する問題