Все Ванги в отпуске. Но я попробую предположить, что либо твой код на pygame кривой, либо потому что V8 в целом на порядок быстрее, чем CPython, как минимум из-за JITа своего, либо и то и другое.
Svoboda Gaming, чего нарастающе? Конкретней цифры есть? Хотя бы порядок. Потому что обычно такие вопросы задают мамкины погромисты, которые считают, что тысяча записей в БД - это хайлоад и бигдата. А у «нарастающе» есть характеристики.
Akula1337, я за один день могу успеть пописать на Python, JavaScript, TypeScript и иногда Go. В свободное время пытаюсь осилить Rust и на нем тоже получается пишу. Никогда не было такого, чтобы путался. Наоборот, так даже лучше.
Сергей, если у тебя нет изменений на канвасе — перерисовывать даже 30fps бесполезно. Погугли паттерн Observer.
Коротко так: твой рендерер подписывается на изменения фигур на канвасе и сидит на стуле ровно, пока изменений нет. Как только изменения есть — запускается рендер.
Но в этом случае может быть дикий fps в пиковых нагрузках, когда слишком много динамики. Для этого нужно в рендер-функции проверять, когда последний раз запускался рендер. И если он был не раньше, чем 1/30 секунд назад, то не перерисовывать, а добавлять в очередь на перерисовку. Этот тротлинг делать сложней, чем бесконечный цикл, но не факт, что даже нужно. Возможно достаточно просто перерисовывать мгновенно при получении каждого изменения.
Зато наблюдатель избавит тебя от бесконечного цикла и лишней траты cpu.
Однако, если элементов для отрисовки много (например, это экшн игра типа контр-страйка), то подписываться на изменения может быть очень затратно по памяти. Тогда бесконечный цикл может выиграть. Но только если фигур миллионы.