2010-12-07 35 views
2

Contexte:ternaires (! Et plus) de surcharge __add__ en Python

En tant que projet d'apprentissage personnel que je travaille sur un simple système d'algèbre informatique. J'ai une classe polynomiale univariée où les coefficients des termes sont stockés en tant que dictionnaire. L'opérateur surchargeant la somme de deux polynômes A et B implique de trouver les termes similaires, de les ajouter et de créer un nouveau terme pour les termes dans A ou B mais pas les deux (XOR). Cela fonctionne comme prévu, mais ...

Question:

J'ai remarqué quand je voulais ajouter plus de deux polynômes le processus est lent car il y a un calcul commun qui pourrait être fait en même temps. Par exemple, avec quatre polynômes (A, B, C, D) la somme:

A + B + C + D 

est évaluée comme suit:

((A+B) + C) + D 

en d'autres termes:

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

Pourriez-je écrire une surcharge spéciale de la fonction add qui serait appelée quand il y a plusieurs sommations?

add(A,B,C,D) 

Répondre

2

Il est (un peu) faisable avec certains piratage ...

Fondamentalement, le processus consiste à ne pas retourner une valeur après le calcul initial - mais plutôt, pour renvoyer une promesse que vous allez calculer la valeur à un certain po int.

Alors a + b retournera un objet représentant le calcul à faire (mais pas réellement effectuer le calcul), que j'appellerai (+ a b).

Ensuite, quand il s'agit d'évaluer l'ajout suivant, nous nous retrouvons avec (+ a b) + c qui évalue à (+ a b c), et ainsi de suite.

Lorsque vous accédez à une propriété du résultat, effectuez-vous réellement le calcul.

+0

Est-ce que cela s'appelle quelque chose? J'aimerais regarder quelques exemples de roues avant de réinventer la mienne. Ma conjecture est une sorte d'évaluation paresseuse, mais c'est un concept général pour être utile dans une recherche. – Hooked

+0

@Hooked: Il est fondamentalement juste évaluation paresseuse. Je suis désolé, mais je n'ai pas de bons exemples en main - je pense que votre meilleur pari serait de voir comment un langage paresseux comme Haskell est mis en œuvre sous le capot. –

2

Avez-vous réellement profilé le code pour déterminer où est votre goulot d'étranglement? Les appels de fonction en python sont assez rapides.

+0

Je pense que le goulot d'étranglement est « déballer » les polynômes à leurs termes de composants, de les emballer de secours, pour ensuite les déballer à nouveau pour la prochaine ajouter. –

+0

Anon a raison, mais j'ai délibérément évité de poster du code pour rendre la question plus générale. Je voudrais savoir si le processus est _possible_, pas comment implémenter une instance spécifique. – Hooked

3

ce que je pourrais écrire une surcharge spéciale de la fonction d'ajout qui serait appelé quand il y a plusieurs sommations?

En bref: Non

est ici la liste de tous les opérateurs et les paramètres: http://docs.python.org/reference/datamodel.html#emulating-numeric-types

En utilisant une fonction personnalisée est votre seule option

+1

Et si vous avez une belle classe 'Polynomial', vous pouvez l'implémenter sous le nom de staticmethod' Polynomial.add' qui serait aussi simple. –

1

Vous pouvez utiliser réduire fonction intégrée

comme cela réduit (lambda x, y: x + y, [1, 2, 3, 4, 5]) et il sera calcule ((((1 + 2) +3) +4) +5).

plus d'informations à ce sujet, vous pouvez obtenir à partir d'ici: http://docs.python.org/library/functions.html#reduce

+0

Réduire, dans ce cas au moins, est identique à l'énoncé 1 + 2 + 3 + 4 + 5. Ce que je cherche, c'est une fonction différente à appeler quand il y a des sommations chaînées, une qui n'est pas binaire. – Hooked