Python

Как ускорить код Python?

У меня есть алгоритм для игры который создаёт большой список с вложенными списками.
И ещё один алгоритм который работает с таким списком. Но этот алгоритм очень медленный и снижает FPS в игре прилично.
Как мне можно ускорить алгоритм работы со списком?

P.S:
Код алгоритма на гитхабе: https://github.com/KukovDev/test/blob/main/code.py
Если нужен весь код то скину.
Очевидный способ ускорить код - реорганизовать структуру данных так, чтобы не требовалось 4 вложенных цикла. Или хотя бы отсекать заведомо не отображаемые на данном шаге части четырёхмерного массива.

Похоже, ты на каждом шаге заново анализируешь и перерисовываешь всё поле. Но ведь ты имеешь всю информацию - что было нарисовано на прошлом шаге, на сколько поле сдвинулось, что на видимом участке поля добавилось и исчезло... Зачем анализировать то, что заведомо не попадёт на экран, и то, что на экране заведомо не поменялось (а, возможно, лишь сдвинулось)?

Перерисовывать не всё целиком, а сдвинуть то, что сдвинулось (без перерисовки: нарисованное на прошлом шаге у нас уже есть - копируем нужный участок изображения), добавить только то, что появилось, убрать только то, что исчезло...

Понятно, что это только голая идея... Но когда я несколько десятилетий назад реализовывал Жизнь, учёт только тех клеток, которые потенциально могут поменяться, позволил ускорить код на один-два порядка.
ДВ
Дмитрий Викторович
97 720
Лучший ответ
Евгений Л Понял, спасибо
Перепиши свой алгортим с использованием numpy
1. Улучшить алгоритм - возможно что-то из него можно выкинуть, ускорить
2. Библиотеки numpy, numba
Алексей Быков
Алексей Быков
34 940
На редкость хороший код что свидетельствует о небольшом опыте разработки xD.

>> Как ускорить код Python?
Ну практически ни как. ( Это как перевозить слона на жигулях 5й модели ).

Главная ошибка алгоритма в том что на каждой итерации алгоритма (отрисовки) выполняются одни и те же действия с одними и теми же результатами т.е. 99.9% работы выполняется зря.

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

Могу порекомендовать учится работать с собственным кодом т.е. разработать методы позволяющие анализировать работу твоего кода.
анализировать - это получать значения в цифрах ... объемах памяти, секундах исполнения и.т.д. выводить их на графики хотя бы с помощью экселя и прочих.
Обычно в таких целях используют тесты, логи, профайлеры (отладочноаналитические данные).
Nursultan Matisakov
Nursultan Matisakov
12 593
Евгений Л Грубо говоря мой алгоритм работает так:
Если камера видит чанк - обработать блоки в чанке.
Если камера видит блок в чанке - отрисовать.
Всё что вне камеры (в частности чанки) алгоритм особо не обрабатывает.

Думаю можно попробовать отрисовывать блоки вне алгоритма.
Просто сохранять позиции блоков в список и после завершения алгоритма проходиться по списку и отрисовывать блоки.
Евгений Л а так, спасибо
Nursultan Matisakov >> Если камера видит блок в чанке - отрисовать.
по нормальному в буфере уже должно лежать готовое отображение для чанка и это изображение (геометрия) обновляется только один раз когда изменяются данные в этом чанке это позволит уменьшить бесполезные перерисовки в тысячи раз.
А если еще организовать данные в виде связанных структур ссылающихся на зависимые/взаимодействующие блоки то можно избежать переборы массивов используя в разы эффективнее работающие бинарные деревья.
1 переписать на язык с транслятором и хорошим оптимизатором
2 перейти на cithon
3 забыть змея.
Егор Золотарёв
Егор Золотарёв
11 711
Переписать на С
Евгений Л Долго + не просто.
Евгений Л я помню что существуют какие то способы но они мне не подходят. Мне надо просто ускорить работу со списком