При сравнении math.sqrt(…)
со встроенным бинарным оператором, … ** 0.5
в REPL с использованием timeit.timeit(…)
, выглядит так, как будто бинарный оператор имеет небольшое преимущество над функцией модуля math
:
… хотя мне приходилось увеличивать число итераций до 1 000 000, чтобы получить видимые различия (обратите внимание, что я компенсировал накладные расходы на поиск функции модуля, напрямую импортировав sqrt
из math
в соответствующем тесте ).
В этом случае я еще не углубился в проверку более очевидных оптимизированных путей кода - например, вызов функций libm
через расширение или модуль cython
- так как я стараюсь придерживаться своего новогоднего разрешения не преждевременно оптимизировать более одного раза в неделю; в отличие от других связанных вопросов , я добиваюсь целочисленного результата перед выполнением.
Это, в частности, операция в горячей петле функции синхронной обработки изображений, которая использует PIL / Pillow для рендеринга изображения в виде монотонного полутона с точечным экраном ‡ , который сейчас на два порядка медленнее; он не может быть легко cythion
-изменен или numpy
-изменен из-за того, что в настоящее время используется API-интерфейс векторного рисования Pillow (но, к вашему сведению, я не боюсь отойти от этих элементов проблемы; например, я уже заменил вызывает пакет Pillow ImageStat.Stat
с более быстрыми и менее затратными на заказ функциями , выполнение которых было наглядным и вовсе не преждевременным актом оптимизации).
Мой вопрос таков: каковы важные преимущества и недостатки обоих этих методов (и / или любых дополнительных методологий с квадратным корнем, которые я не назвал) - как в общем смысле, так и тех, которые конкретно относятся к математическая среда Python? И, что более важно, затмевают ли эти проблемы другие проблемы, такие как вышеупомянутые проблемы с издержками, такие как поиск атрибутов, диспетчеризация функций и тому подобное?
Я часто обнаруживал, что существуют простые ответы о производительности для каждого из этих элементов как единое целое, но когда код Python должен соответствовать стандартам производительности, все эти подзадачи проходят через серую область недопонимания - поэтому я особенно надеюсь услышать от любого, кто работал над такой проблемой и понимает, к чему следует относиться серьезно.
<Ч />
‡ Происхождение самого полутонового кода происходит от этого превосходного и проверенного временем SO ответа .