Как я могу улучшить производительность этого вложенного l oop? - PullRequest
0 голосов
/ 13 апреля 2020

Я работаю над проблемой соответствия, когда я должен назначать учеников в школы. Проблема в том, что я должен учитывать братьев и сестер для каждого учащегося, так как это важная функция во время установления приоритетов для каждой школы.

Мои данные выглядят так, как показано ниже.

Index Student_ID    Brothers
0   92713846    [79732346]
1   69095898    [83462239]
2   67668672    [75788479, 56655021, 75869616]
3   83396441    []
4   65657616    [52821691]
5   62399116    []
6   78570850    [62046889, 63029349]
7   69185379    [70285250, 78819847, 78330994]
8   66874272    []
9   78624173    [73902609, 99802441, 95706649]
10  97134369    []
11  77358607    [52492909, 59830215, 71251829]
12  56314554    [54345813, 71451741]
13  97724180    [64626337]
14  73480196    [84454182, 90435785]
15  70717221    [60965551, 98620966, 70969443]
16  60942420    [54370313, 63581164, 72976764]
17  81882157    [78787923]
18  73387623    [87909970, 57105395]
19  59115621    [62494654]
20  54650043    [69308874, 88206688]
21  53368352    [63191962, 53031183]
22  76024585    [61392497]
23  84337377    [58419239, 96762668]
24  50099636    [80373936, 54314342]
25  62184397    [89185875, 84892080, 53223034]
26  85704767    [85509773, 81710287, 78387716]
27  85585603    [66254198, 87569015, 52455599]
28  82964119    [76360309, 76069982]
29  53776152    [92585971, 74907523]
...
6204 rows × 2 columns

Student_ID - это уникальный идентификатор для каждого учащегося, а Brothers - это список со всеми идентификаторами, которые являются братьями и сестрами этого учащегося.

Чтобы сохранить свои данные для сопоставления, я создаю класс Student. где я сохраняю все атрибуты, которые мне нужны для сопоставления. Вот ссылка для загрузки всего набора данных .

class Student():
    def __init__(self, index, id, vbrothers = []):
        self.__index = index
        self.__id = id
        self.__vbrothers = vbrothers

    @property
    def index(self):
        return self.__index

    @property
    def id(self):
        return self.__id

    @property
    def vbrothers(self):
        return self.__vbrothers

Я создаю экземпляр объекта класса Student, выполняя al oop на всех строках моего кадра данных, затем добавляя каждый один в списке:

students = []
for index, row in students_data.iterrows():
    student = Student(index, row['Student_ID'],  row['Brothers'])
    students.append(student)

Теперь моя проблема в том, что мне нужен указатель на индекс каждого брата в списке students. На самом деле, я реализую этот вложенный l oop:

for student in students:
    student.vbrothers_index = [brother.index for brother in students if (student.id in brother.vbrothers)]

Это раздел с худшей производительностью из всего моего кода. Это в 4 раза медленнее, чем второй худший раздел.

Любые предложения о том, как улучшить производительность этого вложенного l oop, приветствуются.

1 Ответ

1 голос
/ 13 апреля 2020

Поскольку порядок в students не имеет значения, сделайте его словарем:

students = {}
for index, row in students_data.iterrows():
    student = Student(index, row['Student_ID'],  row['Brothers'])
    students[row['Student_ID']] = student

Теперь вы можете получить каждого учащегося по его идентификатору за постоянное время:

for student in students:
    student.vbrothers_index = [students[brother.id].index for brother in student.vbrothers]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...