2012-03-27 12 views
1

編輯: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埃爾南德斯

+0

這實際上是一個編程設計問題,而不僅僅是一個Python問題。這種簡單的緩存可以用任何語言來完成。 – 2012-03-27 22:02:56

回答

1

基本上,它取決於你如何往往需要特別的事情與你需要多久就是它的基礎上的。

如果只有查詢您曾經使公司員工是哪些是三十多歲,和你正在運行性能問題做出該查詢,然後是有意義的計算它的時間提前。如果另一方面,這只是衆多查詢中的一個,那麼使用大量預先計算的東西混淆數據模型就沒有多大意義;保持模型簡單並在需要時計算+緩存所需內容將使代碼更易於使用。

只針對性能優化需要來優化性能,如果這樣做會以可維護性/編碼時間爲代價。(見http://c2.com/cgi/wiki?PrematureOptimization

+0

這就是我需要聽到的,並且在發佈之後,我從我編輯過的SO問題中得到了啓發。我聽說過所有關於過早優化的陷阱,但我從來沒有寫過一個足夠大的程序,所以它成了一個問題。在這種情況下,你是對的;我會繼續深入查詢,直到我清楚需要使用冗餘列表。 非常感謝! – 2012-03-27 21:32:13