Производительность Python: квадратные корни и стратегия работы с горячей петлей - PullRequest
0 голосов
/ 18 марта 2019

При сравнении math.sqrt(…) со встроенным бинарным оператором, … ** 0.5 в REPL с использованием timeit.timeit(…), выглядит так, как будто бинарный оператор имеет небольшое преимущество над функцией модуля math:

enter image description here

… хотя мне приходилось увеличивать число итераций до 1 000 000, чтобы получить видимые различия (обратите внимание, что я компенсировал накладные расходы на поиск функции модуля, напрямую импортировав sqrt из math в соответствующем тесте ).

В этом случае я еще не углубился в проверку более очевидных оптимизированных путей кода - например, вызов функций libm через расширение или модуль cython - так как я стараюсь придерживаться своего новогоднего разрешения не преждевременно оптимизировать более одного раза в неделю; в отличие от других связанных вопросов , я добиваюсь целочисленного результата перед выполнением.

Это, в частности, операция в горячей петле функции синхронной обработки изображений, которая использует PIL / Pillow для рендеринга изображения в виде монотонного полутона с точечным экраном , который сейчас на два порядка медленнее; он не может быть легко cythion -изменен или numpy -изменен из-за того, что в настоящее время используется API-интерфейс векторного рисования Pillow (но, к вашему сведению, я не боюсь отойти от этих элементов проблемы; например, я уже заменил вызывает пакет Pillow ImageStat.Stat с более быстрыми и менее затратными на заказ функциями , выполнение которых было наглядным и вовсе не преждевременным актом оптимизации).

Мой вопрос таков: каковы важные преимущества и недостатки обоих этих методов (и / или любых дополнительных методологий с квадратным корнем, которые я не назвал) - как в общем смысле, так и тех, которые конкретно относятся к математическая среда Python? И, что более важно, затмевают ли эти проблемы другие проблемы, такие как вышеупомянутые проблемы с издержками, такие как поиск атрибутов, диспетчеризация функций и тому подобное?

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

<Ч />

‡ Происхождение самого полутонового кода происходит от этого превосходного и проверенного временем SO ответа .

...