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

Why is sys.path a list?

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

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

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

  • 有序集是
    • 最近的想法(Does Python have an ordered set? 中提到的配方适用于 2.6+)
    • 一个非常特殊用途的结构(甚至不在标准库中)
  • 没有实际需要增加复杂性
    • List是一个非常简单的结构,而ordered set基本上就是一个hashtable+list+编织逻辑
    • 您不需要对 sys.path 进行操作,这是为集合设计的 - 检查确切的路径是否在 sys.path - 更不用说,做起来非常快
    • 相反,sys.path 的典型用例恰恰是列表的用例:按顺序尝试元素,添加或追加一个元素

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