gpt4 book ai didi

python - 优雅与性能 : When to use redundant lists for queries?

转载 作者:太空宇宙 更新时间:2023-11-03 19:20:28 25 4
gpt4 key购买 nike

编辑:When should and shouldn't you break away from OOP for speed/performance?可能与这个问题相关。

如果我的问题不清楚,我很抱歉;我是一名业余爱好者,如果我受过更好的教育,我可能会知道一些更具体的相关术语。请允许我使用一些简单的示例代码。

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一样被专家普遍认为是不好的形式?

--更多信息--

在 EmployeeRecords 中注册时,将 Employee 实例添加到相关列表中似乎在计算上可能更有效。然而,我最近(最后)一直在研究 SQL,似乎有效使用它的一个重要部分是“数据规范化”:从多个表中删除冗余数据,否则这些数据可以通过更深入的查询来获得。

我可以理解并同意拥有冗余数据会引发错误;当我的查询可以通过对象(或者在 SQL 的情况下,表)关联从单个列表中提取数据时,为什么还要费心更新所有这些冗余列表呢?在上面的示例中,列表理解将始终返回正确的信息,但如果我愚蠢地附加 my_records.employees 而不是使用 ,使用 my_records.in_thirties 会产生意外结果>my_records.register_employee

这只是一个示例,在代码管理和性能方面,这两种方法之间几乎没有什么区别。但实际上,查询可能涉及搜索对象列表中的列表,这些对象的属性是需要查询其他对象的列表。

为此目的避免冗余列表是否被认为是良好实践,或者大多数人认为有利于重复进行非常深入的搜索?我知道 Python 不是 SQL,但我认为 OOP 很大程度上是通过使用属性来建立对象之间的关系,因此我可以看到为什么这些类型的列表会被认为是不好的形式并且容易出现错误。

感谢您的帮助。我没有受过正规教育,尽管我拥有多年的宠物项目编程经验,但我总是以有效架构的方式学习新东西。这是我在浏览多年后在 SO 上发表的第一篇文章,所以如果这是一个愚蠢或不恰当的问题,请保持温和。我不知道还能去哪里!

-大卫·埃尔南德斯

最佳答案

基本上,这取决于您需要特定事物的频率与您需要它所基于的事物的频率。

如果您对员工进行的唯一查询是哪些人在三十多岁,并且您在进行该查询时遇到了性能问题,那么这是有道理的提前计算它。

另一方面,如果这只是您正在执行的众多查询中的一个,那么用大量预先计算的东西来扰乱您的数据模型就没有意义了;保持模型简单并在需要时计算+缓存您需要的内容将使您的代码更易于使用。

仅优化您需要的性能优化,如果这样做会以可维护性/编码时间为代价。(请参阅 http://c2.com/cgi/wiki?PrematureOptimization。)

关于python - 优雅与性能 : When to use redundant lists for queries?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9897872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com