Элегантность и производительность: когда использовать избыточные списки для запросов? - PullRequest
1 голос
/ 28 марта 2012

РЕДАКТИРОВАТЬ: Когда вы должны и не должны отойти от ООП для скорости / производительности? может иметь отношение к этому вопросу.

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

class EmployeeRecords(object):
    """A record of all employees."""
    def __init__(self):
        super().__init__()
        self.employees = []
        # The following two attributes are redundant.
        self.at_office = {"LAN":[], "DET":[], "KAL":[]}
        self.in_thirties = []

    def register_employee(self, employee):
        """Register a new employee in the records.

        This entire method is redundant.

        """
        self.employees.append(employee)
        self.at_office[employee.office_code].append(employee)
        if 30 <= employee.age < 40:
            self.in_thirties.append(employee)

class Employee(object):
    """An employee record featuring relevant information for queries."""
    def __init__(self, first_name, last_name, age, office_code):
        super().__init__()
        self.first_name = first_name
        self.last_name = last_name
        self.age = age
        self.office_code = office_code


# Instantiation and what-not goes here.
...

print([x for x in my_records.employees if 30 <= x.age < 40])
# VS
print(my_records.in_thirties)

Что является более подходящим?Является ли последний метод обычно плохим для экспертов, как SO?

- Подробнее -

Кажется, что в вычислительном отношении было бы эффективнее просто добавлять экземпляры Employee к соответствующимсписки при регистрации в EmployeeRecords.Тем не менее, я недавно изучал SQL (наконец), и кажется, что большая часть его эффективного использования - это «нормализация данных»: удаление избыточных данных из нескольких таблиц, которые в противном случае могли бы быть получены с помощью более глубокого запроса.

Я вижу, как и согласен, что наличие избыточных данных может привести к ошибкам;зачем беспокоиться о том, чтобы все эти избыточные списки обновлялись, когда мои запросы могут извлекать данные из одного списка через сопоставление объектов (или, в случае SQL, таблицы)?В приведенном выше примере понимание списка всегда вернет правильную информацию, но использование my_records.in_thirties даст неожиданные результаты, если я по глупости добавлю my_records.employees вместо использования my_records.register_employee.

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

Считается ли хорошей практикой избегать избыточных списков для этой цели,или это будет считаться большинством выгодным для повторных очень глубоких поисков?Я понимаю, что Python - это не SQL, но я думаю, что ООП в значительной степени относится к отношениям между объектами посредством использования атрибутов, и поэтому я могу видеть, как эти типы списков будут считаться плохой формой и подвержены ошибкам.

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

- Дэвид Эрнандес

1 Ответ

1 голос
/ 28 марта 2012

В основном это зависит от того, как часто вам нужна конкретная вещь, а не от того, как часто вам нужно, на чем она основана.

Если запрос only вы когда-либо делаете оСотрудники, которым за тридцать, и вы сталкиваетесь с проблемами производительности при выполнении этого запроса, поэтому имеет смысл вычислить его заранее.

Если, с другой стороны, это только один из многихзапросы, которые вы делаете, не имеет смысла загромождать ваши модели данных тоннами предварительно вычисленных вещей;упрощение моделей и вычисление + кэширование того, что вам нужно, когда вам это нужно, значительно облегчит работу с вашим кодом.

Оптимизируйте только для производительности то, что вам нужно , необходимое для оптимизациипроизводительность, если это произойдет, за счет времени обслуживания / кодирования. (См. http://c2.com/cgi/wiki?PrematureOptimization.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...