Насколько важна локализация переменных Python для повышения производительности?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Насколько важна локализация переменных Python для повышения производительности?

Сообщение Anonymous »

Я работаю над проектом Python (3.12), который сталкивается с проблемами производительности в определенном методе.
Большая часть времени тратится на код следующего типа: р>

Код: Выделить всё

def method(self):
for r in range(self.depth):
for s in self.very_large_precomputed_list_of_lists[r]:
for t in self.scalars:
...
method_2(r, s, t, ...)
Со множеством вложенных циклов for, которые перебирают довольно большие заранее вычисленные итерации. Это метод класса, и большая часть кода в методе_2 (который встроен) ссылается на переменные класса, такие как self.other_precomputed_data, и почти нет серьезных вызовов функций, кроме повторяющихся вызовов self.special_func, который представляет собой относительно недорогая функция, указатель которой (наверное?) хранится как переменная класса.
Прежде чем кто-нибудь скажет, мне, по сути, придется использовать Python для этого проекта. И все знают, что «питон медленный». Здесь «медленно» означает, что выполнение может занять 20 минут. Но люди, которые знают, что делают, по-прежнему преуспевают в Python, и я потратил немного времени на поиск в Google простых изменений кода Python, которые можно внести, чтобы повысить производительность.
Один бросилось в глаза: в нескольких местах, напр. здесь предполагается, что максимальное использование переменных локальной области может привести к весьма значительному повышению производительности. Таким образом, искусственное принудительное использование часто используемых переменных может повысить производительность.
Мой вопрос: существуют ли общие правила или хорошие места, где можно почитать о технических деталях, которые помогут мне понять, когда это можно правильно применить, а когда это просто глупо?
Почему я говорю «глупый»? Я отнесся к этому совету серьезно, и теперь мой код выглядит так:

Код: Выделить всё

for r in range(self.depth):
cached_var_1 = self.var_1[r]
cached_var_2 = self.var_2[r].items()
cached_var_3 = self.special_func
cached_var_4 = tuple
cached_var_5 = range
cached_var_6 = self.very_large_precomputed_list_of_lists[r]
...

for s in cached_var_6:
for t in self.scalars:
... (many more for loops)
# the main code which now references the 'cached' or localised variables
# rather than their global names
Там, где я сделал локальными несколько часто используемых и, возможно, «дорогих» переменных, в том смысле, что для их получения может потребоваться поиск в довольно больших словарях/списках, поэтому я сделал это за пределами более дорогих циклов for. У меня могло быть много придирок, например: действительно ли это помогает? Должен ли я поместить эти переменные туда, где они есть, или сделать их «более локальными» и поместить во внутренние циклы for? Должен ли я локализовать буквально все, на что ссылается основной код, или только несколько переменных? ...
Я провожу тестирование производительности, но попутно провожу множество других оптимизаций, поэтому трудно понять, насколько полезна эта практика «локализации». Возможно, мне просто нужно делать это «больше», прежде чем я замечу разницу. Есть совет?

Подробнее здесь: https://stackoverflow.com/questions/790 ... erformance
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»