編輯: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)
哪個更合適?專家認爲後一種方法通常被認爲是不良形式嗎?
- 更多Info--
看起來這可能是計算上更有效,只是Employee實例在註冊時在EmployeeRecords添加到相關列表。然而,我最近一直在研究SQL(最後),似乎有效地使用它的很大一部分是'數據規範化':從多個表中刪除冗餘數據,否則可能通過更深層的查詢獲得。
我可以看到如何並同意有冗餘數據可以引發錯誤;爲什麼在我的查詢可以通過對象(或SQL的情況下,表)關聯從單個列表中提取時更新所有這些冗餘列表?在上例中,列表理解將始終返回正確的信息,但如果我愚蠢地追加my_records.employees
而不是使用my_records.register_employee
,則使用my_records.in_thirties
會產生意想不到的結果。
這只是一個例子,在代碼管理和性能方面,兩種方法之間幾乎沒有區別。然而,在實踐中,查詢可能涉及在屬性列表中需要查詢其他對象的對象列表中搜索列表。
爲避免冗餘列表出於此目的被認爲是一種好的做法,或者最常被認爲是有利於反覆進行非常深入的搜索?我知道Python不是SQL,但我認爲OOP通過使用屬性非常關注對象之間的關係,所以我可以看到這些列表如何被認爲是不好的形式,並且容易出現錯誤。
感謝您的幫助。我沒有受過正規教育,雖然我有多年的寵物項目編程經驗,但我始終以有效的架構學習新事物。這是我在瀏覽它多年後的第一篇文章,所以如果這是一個愚蠢或不恰當的問題,請保持溫柔。我不知道還有什麼可以轉身的!
-David埃爾南德斯
這實際上是一個編程設計問題,而不僅僅是一個Python問題。這種簡單的緩存可以用任何語言來完成。 – 2012-03-27 22:02:56