2017-04-25 70 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

相关问题