2016-01-18 2 views
0

Я использовал аЬс в прошлом, и я хотел бы использовать их снова, чтобы обеспечить соблюдение чисто виртуальным, как методы с @abstractmethod. Это относится к интерфейсу Python к API, который часто будет распространяться пользователями.вычислительной стоимость ABC

Для меня слишком сложно разработать надежный комплексный тест масштаба, и я всегда использовал abc как закрытую коробку с черной магией, поэтому я не знаю, где стоимость абстракции и проверки абстрактов есть, и когда это вероятно понесло, или то, что на самом деле будет стоить, или то, что оно будет масштабировать.

Я не мог найти удовлетворительно полную информацию о лежащей в основе механике в любом месте, поэтому любые указатели на то, когда и где происходит магия, и по какой цене будет очень оценено (импорт? Instancing? Double dipping cost, если экземпляр расширен?)

Дополнительная информация о прецеденте: В отличие от предыдущих случаев использования (для меня), где было очень ограниченное количество экземпляров каждого базового объекта и abc, измеренное без каких-либо ощутимых накладных расходов, на этот раз вокруг него быть чем-то (узлы в DAG с древовидным представлением), которые могут быть инстанцированы, а затем расширены на месте сотни раз, а количество виртуальных методов, вероятно, будет расти примерно до десятка на класс.

Наследование никогда не несколько, и это обычно довольно мелкие, в лучшем случае два или три глубокие, большинство времени только один.

Python 2.7 из-за 3-сторонних платформ ограничений.

ответ

1

До Python 2.6, с помощью ABC пришла с некоторыми значительными накладными расходами. Issue 1762 сообщил об этом как об ошибке, и он был исправлен для Python 2.6 (путем перемещения некоторых машин ABC в реализацию C object).

В новых версиях Python разница между производительностью ABC и не ABC с использованием классов должна быть очень незначительной (ошибка указывает на очень небольшую оставшуюся разницу в скорости isinstance, но другие действия с нулевым значением разница в производительности).

+0

Я не думал смотреть на вопросы; спасибо, это очень помогает. Знаете ли вы, что первая проверка @abstractmethod происходит во время импорта (или когда установлены первые зависимости) или несколько отложено? Это мое предположение (по импорту), но в лучшем случае это интуиция. –

+1

Да, почти вся работа происходит, когда определен абстрактный класс. Вы можете увидеть реализацию модуля '' abc' (https://hg.python.org/cpython/file/2.7/Lib/abc.py). Что не будет очевидно из кода модуля, так это то, как он фактически предотвращает создание объектов с абстрактными методами. Это бит, который переместился в C-код, в ['typeobject.c'] (https://hg.python.org/cpython/file/2.7/Objects/typeobject.c). 'type_set_abstractmethods' устанавливает флаг, если' __abstractmethods__' присваивается непустой список. Затем object_new' проверяет этот флаг перед созданием нового объекта. – Blckknght

+0

Вот и все, что мне нужно было знать. Мог бы быстро засунуть в источник, если у меня есть другие сомнения, я не смотрел на источник cpy в возрасте собаки. Еще раз спасибо. –