В процессе настройки моего любимого проекта улучшилась его производительность. Я уже выкинул профайлер, чтобы определить горячие точки, но я думаю, что понимание характеристик производительности Pythons немного лучше было бы очень полезно в будущем.
Есть несколько вещей, которые я хотел бы знать:
Насколько разумным является его оптимизатор?
Некоторые современные компиляторы были благословлены замечательно умными оптимизаторами, которые часто могут принимать простой код и заставлять его работать быстрее, чем любые попытки пользователя по настройке кода. В зависимости от того, насколько интеллектуальным является оптимизатор, для моего кода может быть намного глубже.
В то время как Python является "интерпретированным" языком, он, похоже, компилируется до некоторой формы байт-кода (.pyc). Насколько он умен, когда он это делает?
- Будет ли он сбрасывать константы?
- Будет ли он встроить небольшие функции или развернуть короткие циклы?
- Будет ли он выполнять сложный анализ данных/потоков. Я не квалифицирован для правильного объяснения.
Насколько быстрыми являются следующие операции (сравнительно)
- Функциональные вызовы
- Создание экземпляра класса
- Арифметика
- "Тяжелые" математические операции, такие как sqrt()
Как обрабатываются числа внутри?
Как хранятся числа в Python. Сохраняются ли они как целые числа/поплавки внутри или перемещаются в виде строки?
NumPy
Сколько может быть разница в производительности в NumPy? Это приложение сильно использует векторы и смежную математику. Сколько можно сделать, используя это, чтобы ускорить эти операции.
Что-нибудь еще интересное
Если вы можете придумать что-нибудь еще, что стоит знать, не стесняйтесь говорить об этом.
Некоторый фон...
Так как есть несколько человек, которые привносят "первый взгляд на ваши алгоритмы" (это довольно разумный совет, но на самом деле не помогает с моей целью задавать этот вопрос), я немного добавлю, и почему я спрашиваю об этом.
Предложенный проект для животных - это трассировщик лучей, написанный на Python. Это еще не очень далеко, и в настоящее время просто ударяют тесты против двух объектов (треугольника и сферы) внутри сцены. Выполнение расчетов затенения, затенения или освещения не выполняется. Алгоритм в основном:
for each x, y position in the image:
create a ray
hit test vs. sphere
hit test vs. triangle
colour the pixel based on the closest object, or black if no hit.
Алгоритмические уточнения в трассировке лучей обычно работают путем устранения объектов в начале сцены. Они могут обеспечить значительный толчок для сложных сцен, но если этот луч-трассировщик не сможет опрокинуть два простых объекта без борьбы, то он не сможет справиться очень сильно.
Хотя я понимаю, что луч-трассировщик, основанный на Python, не сможет достичь производительности на основе C, учитывая, что трассировки лучей реального времени, такие как Arauna может управлять 15-20 FPS на моем компьютере, предоставляя достаточно сложные сцены на 640x480, я ожидаю, что рендеринг очень простого изображения 500x500 в Python будет выполнен в течение секунды.
В настоящее время мой код занимает 38 секунд. Мне кажется, что это действительно не так долго.
Профилирование показывает большую часть времени, затрачиваемого в реальных процедурах тестирования для этих фигур. Это не особенно удивительно в лучей, и я ожидал. Количество вызовов для этих хит-тестов составляет 250 000 (точно 500 × 500), что указывает на то, что их вызывают точно так же часто, как и должны быть. Это довольно текстовая книга из 3%, где рекомендуется оптимизация.
Я планирую делать полную синхронизацию/измерение, когда я работаю над улучшением кода. Однако, без каких-либо базовых знаний о том, что стоит в Python, мои попытки настроить мой код будут немного больше, чем спотыкаться в темноте. Я полагал, что это послужит мне хорошо, чтобы получить небольшое знание, чтобы осветить путь.