15

python 的 -S 选项由文档定义为“禁用模块站点的导入以及它需要的 sys.path 的站点相关操作”。我发现当我使用这个选项时,我机器上的 python 启动速度是原来的两倍多,有时甚至更快。例如,在一台(慢)机器上:

$ time python -c 'print "hello"'   
hello
python -c 'print "hello"'  0.14s user 0.03s system 85% cpu 0.204 total

$ time python -Sc 'print "hello"'
hello
python -Sc 'print "hello"'  0.02s user 0.01s system 73% cpu 0.038 total

这是 5.3 倍的加速。它似乎工作正常,至少在我尝试过的脚本中是这样。使用它有什么缺点?

4

3 回答 3

9

这可能不是一个好主意。除其他外,这意味着不会将 site-packages 目录添加到路径中,因此您将无法导入标准 lib 模块以外的任何内容:

python -Sc "import numpy"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named numpy

你可以看看site.py自己,看看它在做什么。它只是常规库目录中的一个模块。至少在我的系统上,它看起来主要做了四件事:

  • 设置站点包路径
  • 设置默认编码
  • 定义了一些用于交互使用的辅助函数 (quithelp)
  • 设置用户特定的站点自定义

如上所述,第一个可能是最关键的。第二个对于执行字符串 I/O 可能很重要,具体取决于系统的区域设置(即,如果未正确设置默认编码,则可能会出错)。第三个可能不是那么重要。如果您希望自定义每个用户的路径(让用户拥有自己的个人库目录等),最后一个可能很重要。

于 2012-07-03T19:57:00.027 回答
3

-S标志执行以下操作:

不要在初始化时暗示“导入站点”

这意味着在Python 的初始化期间不会导入模块站点。一个简短的描述是这个模块“将附加站点特定的路径到模块搜索路径并添加一些内置”。不做所有这些工作确实会使启动速度更快。

使用文档作为指导,-S标志会导致:

  • 没有额外的模块添加到sys.path. 您可以通过在两者中启动pythonpython -S执行以下操作来比较差异import sys; print sys.path。许多模块将不可用,因此您将无法导入它们。
  • 不会运行自定义站点初始化代码(这可以在名为 的模块中定义sitecustomize)。
  • 自定义初始化代码将不会运行(这可以在名为 的模块中定义usercustomize)。

对您的问题的简短回答是:是的,它使 Python 启动更快,但许多模块和自定义代码将不可用或不可用。

如果您主要导入自己的模块并编写自己的计算/代码,那么-S标志就可以了。但是,如果您有一个 Python 安装并且模块安装在不同的位置,那么您将无法将它们与-S标志一起使用。

于 2012-07-03T19:58:13.457 回答
2

执行此操作时,您将丢失大部分模块搜索路径:

$ python -S
Python 2.6.8 (unknown, Apr 19 2012, 01:24:00) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
>>> import sys
>>> len(sys.path)
9

$ python
Python 2.6.8 (unknown, Apr 19 2012, 01:24:00) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> len(sys.path)
26

根据您的系统,这可能会对可用的模块产生重大影响。

其他可能会破坏的是语言环境(由 site.py 设置为系统默认值),并且在 Windows 上,某些编解码器将不可用(它们由 site.py 别名)。

于 2012-07-03T19:57:10.817 回答