【问题标题】:Why are some Python standard libraries written in .so while most others are in .py?为什么有些 Python 标准库是用 .so 编写的,而大多数其他标准库是用 .py 编写的?
【发布时间】:2019-02-21 06:13:15
【问题描述】:

大多数标准库是用 Python 的 .py 文件编写的,但有些是 Unix 上的 .so 文件和 Windows 上的 .pyd 文件。例如 os 写在 os.py 中,而 pyexpat 写在 pyexpat.cpython-36m-darwin.so 中。这些 .so 库有什么特别之处?

【问题讨论】:

  • 通过标记 wiki,.so 文件是 c++
  • @mast3rd3mon C++ 文件不一定是 *.so。甚至 C 文件也可以是 *.so。为了更清楚 *.so lib 可以使用 C 和 C++ 文件生成。 Python 示例中的许多模块 Numpy 是用 C 编写并导入到 Python 中的。
  • @danglingpointer 那是我的错,我的意思是are written in c++,我不知何故忘记输入了
  • @mast3rd3mon 在 python 的情况下,大部分是written in C

标签: python standard-library .so


【解决方案1】:

.so 文件是共享对象文件,它们是编译后的共享库。它们通常用编译语言编写,如C、C++、Go 等。

Python 是一种解释性语言,用它编写的代码往往很慢,因为解释器需要遍历正在执行的每一行代码,将其翻译成某种中间字节码,然后最终执行字节码。这可能很慢。

在考虑性能的情况下,模块使用较低级别的语言编写,例如 C,然后编译为共享目标文件。这些文件可以由 Python 解释器加载,并像普通的 Python 模块一样使用。由于这些模块已经被编译成机器码,它们可以直接执行而不需要经过解释器,因此它们比用 Python 编写的等效代码要快得多。

使用像C 这样的低级语言编写还可以有效地使用内存,甚至释放全局解释器锁以利用多核并行性。 numpy、scipy 等科学模块就是这些例子。

【讨论】:

  • 感谢您的回答。 numpy 不是用 Python 写的吗?我看到我的安装目录中都是 .py 文件。
  • 它的一部分是在 Python 中,但核心部分是在 C 中(如果你在这里看到你会看到 C 源代码:github.com/numpy/numpy/tree/master/numpy/core/src)。它还依赖于矩阵函数的线性代数库,如 BLAS。这些库通常在 Fortran 中实现,也通过 .so 机制加载。
  • @multigoodverse numpy 不是用 Python 编写的,主要是用 C 语言编写的。*.so 是用 C 语言创建并导入 Python 的共享对象库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2017-06-23
  • 2010-11-01
  • 2011-07-21
  • 1970-01-01
  • 2011-04-17
相关资源
最近更新 更多