Эффективные арифметические специальные методы в Cython - PullRequest
2 голосов
/ 09 марта 2012

Согласно документации Cython, касающейся специальных арифметических методов (перегрузки операторов), способа их реализации я не могу полагаться на self, являющийся объектом, специальный метод которого вызывается.

Очевидно, это имеет два последствия:

  1. Я не могу указать статический тип в объявлении метода. Например, если у меня есть класс Foo, который можно умножить, скажем, на int, то я не смогу получить def __mul__(self, int op), не увидев TypeError с (иногда).
  2. Чтобы решить, что делать, я должен проверить типы операндов, предположительно используя isinstance() для обработки подклассов, что кажется оператору дорогостоящим фарсом.

Есть ли хороший способ справиться с этим, сохранив удобство синтаксиса оператора? Вся моя причина переключения моих классов на типы расширений Cython состоит в том, чтобы повысить эффективность, но, поскольку они сильно зависят от арифметических методов, основанных на вышеизложенном, кажется, что я на самом деле собираюсь сделать их еще хуже.

1 Ответ

2 голосов
/ 09 марта 2012

Если я правильно понимаю документы и результаты моих тестов, у вас может быть быстрый __mul__(self, int op) для Foo, но вы можете использовать его только как Foo() * 4, а не 4 * Foo().Для последнего потребуется __rmul__, что не поддерживается, поэтому оно всегда вызывает TypeError.

Тот факт, что второй аргумент набирается int, означает, что Cython выполняет проверку типов для вас, поэтому выможет быть уверен, что левый аргумент действительно self.

...