为什么sys.path是一个列表?

时间:2017-04-25 15:43:17

标签: python python-internals

为什么实施者会选择将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%的每个人需求的简单结构,它没有避免重复的安全功能,但是它确实带有原始优先级,即列表中元素的索引,您可以通过附加前置或最低优先级轻松设置最高优先级。

添加更丰富的优先级,即在此元素之前插入很少用作接口,这对于简单的任务来说太费力了。正如已接受的答案所述,对于这些额外用例的任何更高级的内容都没有实际需要,因为历史上已经习惯了人们。

2 个答案:

答案 0 :(得分:2)

sys.path指定搜索路径。通常,搜索路径按照指示搜索顺序的项目的顺序排序。如果sys.pathset,那么就没有明确的排序方式会使sys.path变得不那么有用。同样值得考虑的是优化是一个棘手的问题。解决任何性能问题的合理优化是简单地保留已搜索的sys.path元素的记录。尝试使用有序集合变得棘手可能不值得付出努力。

答案 1 :(得分:2)

  • 有序集是
  • 对增加的复杂性没有实际需要
    • List是一个非常简单的结构,而order set基本上是一个哈希表+ list + weaving logic
    • 您不需要使用设置的sys.path进行操作 - 检查确切的路径是否在sys.path - 更不用说了,快点做到这一点
    • 相反,sys.path的典型用例是那些完全用于列表的用例:按顺序尝试元素,预先添加或附加一个

总而言之,既有历史原因,又缺乏实际需要。