Тернарная (и не только!) Перегрузка __add__ в Python - PullRequest
2 голосов
/ 07 декабря 2010

Контекст:

Как личный учебный проект, я работал над простой системой компьютерной алгебры. У меня есть одномерный полиномиальный класс, где коэффициенты к терминам хранятся в виде словаря. Перегрузка оператора суммой двух полиномов 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 ]

3 голосов
/ 07 декабря 2010

Могу ли я написать специальную перегрузку функции добавления, которая будет вызываться при наличии нескольких суммирований?

Короче: Нет

Вот список всехоператоры и параметры: http://docs.python.org/reference/datamodel.html#emulating-numeric-types

Использование пользовательской функции - единственный вариант

2 голосов
/ 07 декабря 2010

Это (вроде) выполнимо при некотором взломе ...

По сути, процесс состоит не в том, чтобы возвращать значение после первоначального вычисления, а скорее в том, чтобы вернуть обещание, что вы вычислите значение в какой-то момент.

Таким образом, a + b вернет объект, представляющий вычисление, которое должно быть выполнено (но фактически не выполняющее вычисление), которое я назову (+ a b).

Затем, когда дело доходит до оценки следующего дополнения, мы получаем (+ a b) + c, что дает (+ a b c) и т. Д.

Только когда свойство свойства получено, вы фактически выполняете вычисления.

2 голосов
/ 07 декабря 2010

Вы на самом деле профилировали код, чтобы выяснить, где находится ваше узкое место?Вызовы функций в Python довольно быстрые.

1 голос
/ 07 декабря 2010

Вы можете использовать уменьшить встроенную функцию

, как это уменьшить (лямбда х, у: х + у, [1, 2, 3, 4, 5]), и этобудет вычислять ((((1 + 2) +3) +4) +5).

дополнительную информацию об этом вы можете получить здесь: http://docs.python.org/library/functions.html#reduce

...