2012-03-09 3 views
2

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

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

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

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

ответ

2

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

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

+1

Вы правы, и я рассматриваю возможность прохождения этого маршрута, но, конечно, он не сохраняет ** полное ** удобство синтаксиса оператора. – ezod

Смежные вопросы