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

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

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

最佳答案

  • 有序集是
  • 没有实际需要增加复杂性
    • List是一个很简单的结构,而ordered set基本上就是哈希表+列表+编织逻辑
    • 您不需要对集合设计用于的 sys.path 进行操作 - 检查确切路径是否在 sys.path 中 - 甚至更少, 做的很快
    • 相反,sys.path 的典型用例恰好是列表的那些用例:按顺序尝试元素,添加或追加元素

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

关于python - 为什么 sys.path 是一个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43615300/

相关文章:

python - Pandas 插值按组添加行,每组具有不同的范围

python - 在 python 3 中以二进制模式打开带有通用换行符的文件

python - 如何创建可以向类添加多个方法的类装饰器?

python - 从 Python-Docx 中的单元格中删除段落

Python 3.4 多处理队列比 Pipe 快,出乎意料

python - python如何在赋值运算符后赋值

python - 如果在异常后不重置,ContextVar 会在异步逻辑中泄漏内存吗?

python - django 从文件导入模板

Python 字符串实习

python - `<attribute ' xxx' of 'C' 对象 >` mean in the output of ` C.__dict__` 是什么意思?