Python在我的Windows7机器上加载的时间是在虚拟机上运行的Ubuntu 14.04(在相同硬件上的Windows内部)的17倍。Anaconda3发行版在Windows和Ubuntu默认的python3.4上使用。
从Bash提示符(Windows上的Git Bash):
$ time python3 -c "pass"
在Windows上返回0.614秒,在Linux 上返回0.036秒
当包裹被装载时,情况会变得更糟:
$ time python3 -c "import matplotlib"
在Windows上返回6.01,在Linux 上返回0.189
Spyder在Windows上的加载时间高达51秒,在Linux上的加载速度高达1.5秒。
我没有任何运气确定我为什么会有这种表现问题。有人知道我下一步该做什么吗?
编辑:
为什么python在windows上的速度慢得多?已经被认为是可能的重复,但我的性能差异要大得多,不能简单地通过不同的库依赖项和编译器来解释。在我看来,这似乎与文件系统的差异有关。
我在访问扫描时怀疑有防病毒软件,但为了以防万一,我禁用了防病毒软件。
>>> sys.path
['', 'c:\Anaconda3\python34.zip', 'c:\Anaconda3\DLLs', 'c:\Anaconda3\lib', 'c:\Anaconda3', 'c:\Anaconda3\lib\site-packages', 'c:\Anaconda3\lib\site-packages\Sphinx-1.2.3-py3.4.egg', 'c:\Anaconda3\lib\site-packages\cryptography-0.8-py3.4-win-amd64.egg', 'c:\Anaconda3\lib\site-packages\nose-1.3.4-py3.4.egg', 'c:\Anaconda3\lib\site-packages\win32', 'c:\Anaconda3\lib\site-packages\win32\lib', 'c:\Anaconda3\lib\site-packages\Pythonwin', 'c:\Anaconda3\lib\site-packages\setuptools-14.3-py3.4.egg']
更新:
在同一台电脑上重新安装Windows 8.1 Pro解决了这个问题。在重新安装所有应用程序和Anaconda3之后,Python的性能是我见过的最好的。不幸的是,这个问题的根本原因仍然未知。
更正:
在我的IT部门安装了Sophos SafeGuard加密软件和MS Endpoint Protection后,问题再次出现。和以前一样起步缓慢。禁用额外的软件并没有解决问题,所以我们正在其他机器上进行测试以跟踪问题。
通过卸载Sophos SafeGuard解决了问题。不过,这并不是一个真正令人满意的解决方案,因为我的公司在我每天访问的目录上使用这个文件系统加密软件。除了Python(显然还有Ruby)之外,我似乎没有任何其他性能问题。
注意:Sophos SafeGuard不是防病毒软件。它是一个企业文件系统加密系统。奇怪的是,本地文件系统(比如安装Python的地方)明确没有启用加密。
可能与您的情况无关,但我发现在Windows中使用Sophos Safeguard和Mcafee Enteprise Antivirus运行python时,如果python作为提升进程运行,则python启动时间会慢一个数量级。将其转换为正常流程对我来说有着巨大的不同
- 启动差异的一个因素可能是默认加载的模块。您可以使用
sys.modules
来比较您的两个环境
python -c "import sys;print(len(sys.modules))"
对我来说,答案是
$ time py -2 -c "pass"
real 0m0.054s
user 0m0.000s
sys 0m0.000s
$ py -2 -c "import sys;print(len(sys.modules))"
44
$ time py -3 -c "pass"
real 0m0.063s
user 0m0.000s
sys 0m0.000s
$ py -3 -c "import sys;print(len(sys.modules))"
54
您还可以使用虚拟环境来操作默认加载的模块。https://virtualenv.pypa.io/en/latest/
- Git bash for windows似乎对我使用python行为不端。当我启动解释器时,我没有看到版本横幅。我会将开始时间与cmd提示符进行比较。甚至用python启动python。例如
-
import subprocess
import time
start = time.time()
subprocess.check_call(["python", '-c ', 'pass'])
print time.time() - start