Как вложить генераторы - PullRequest
0 голосов
/ 06 февраля 2019

Я ищу генераторы, чтобы сделать часть моего кода более эффективной.В настоящее время интересно, как я могу / должен обрабатывать вложенные циклы, каждый из которых создает список.Вложенный цикл повторно генерирует список значений для каждого шага цикла for.Эти значения являются вектором нормализации 3 столбцов передаваемых данных.Из этого списка берется максимальное значение и добавляется в список, который возвращается функцией.Кажется, это можно сделать намного эффективнее, используя генераторы.Однако я не уверен, как обращаться с вложенным циклом for, так как функция остановится на первом выходе.

Код в текущем состоянии;

def define_max_values(data, indexes):

    max_values = []

    for iter in range(len(indexes)):
        data_index_window = data[index[iter] - 5:index[iter] + 50]
        for i in range(len(data_index_window)):
            sub_list = []   
            sub_list.append(np.linalg.norm(data_index_window.iloc[i, 0:3].values))

        max_values.append(max(sub_list))
    return max_values

Я думаю, что это можно превратить в это, используя 1 генератор

def define_max_values(data, indexes):
     for iter in range(len(indexes)):
            data_index_window = data[index[iter] - 5:index[iter] + 50]
            for i in range(len(data_index_window)):
                sub_list = []
                sub_list.append(np.linalg.norm(data_index_window.iloc[i, 0:3].values))

            yield(max(sub_list)

Этот код кажется более читабельным / эффективным уже, но интересно, смогу ли я заменить внутренний список?.append с другой доходностью.

1 Ответ

0 голосов
/ 06 февраля 2019

max не нуждается в последовательности, ее также можно использовать с генераторами, например:

def define_max_values(data, indexes):
    for iter in range(len(indexes)):
        data_index_window = data[index[iter] - 5:index[iter] + 50]
        yield max(np.linalg.norm(
                          data_index_window.iloc[i, 0:3].values) \
                  for i in range(len(data_index_window)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...