2017-04-25 76 views
3

爲什麼執行者會選擇將sys.path列入列表中而不是有序集?sys.path爲什麼是一個列表?

sys.path列爲一個列表會導致在路徑中有多個副本,從而減慢模塊的搜索時間。

一個人爲的例子是下面的傻例如

# instant importing 
import os 
import sys 

for i in xrange(50000): 
    sys.path.insert(0, os.path.abspath(".") 

# importing takes a while to fail 
import hello 

要從意見和答案總結給出:

它從下面的反應似乎是一個列表是一個簡單的結構,處理99%每個人的需求,它沒有避免重複的安全功能,但它確實帶有原始優先級,它是列表中元素的索引,您可以通過預先設置輕鬆設置最高優先級,或通過附加優先級設置最低優先級。

添加更豐富的優先級,即在此元素之前插入很少使用,因爲這樣的界面對於簡單任務來說將花費太多精力。正如接受的答案所述,對於涵蓋這些額外用例的任何更高級的內容,並不存在實際需要,因爲歷史上人們習慣於此。

+10

但順序很重要...('集合'是無序的)。 –

+0

不知道我關注...爲什麼要把它作爲一個列表創建重複? – grail

+4

當然,在列表中可能有重複項,但是這會成爲您在添加之前未檢查的錯。另外,這是一個很小的問題。考慮一下* nix也沒有發現需要從「PATH」中刪除重複50年。保持簡單可以保持速度。 – pbuck

回答

2
  • 有序集
  • 沒有實際需要增加複雜性
    • 列表是一個非常簡單的結構,wh有序集合基本上是一個散列表+列表+編織邏輯
    • 你不需要與sys.path做一個設計的操作 - 檢查確切的路徑是否在sys.path - 更不用說,做得非常快
    • 相反,sys.path的典型應用案例是那些準確的名單:按順序嘗試的元素,前面加上或追加一個

總之,有兩個有歷史原因和缺乏任何實際需要。

+0

想到它之後,除此之外,一個列表是數據的最初形式,我反映了用戶做了什麼,以便開發人員能夠在稍後做出他自己的決定,如何處理它。 – Har

1

sys.path指定搜索路徑。通常,搜索路徑按照指示搜索順序的項目的順序排序。如果sys.pathset那麼將不會有明確的排序使得sys.path不太有用。同樣值得考慮的是,優化是一個棘手的問題。處理任何性能問題的合理優化將只是保留已搜索到的sys.path元素的記錄。試圖對有序集合進行棘手的處理可能是不值得的。

+0

這是一個好點,我已編輯我的帖子反映在訂單 – Har

相關問題