作者:邹杂品_433 | 来源:互联网 | 2023-09-14 20:30
我正在使用python和bc分别评估表达式6^6^6.python文件的内容是打印6**6**6.当我执行timepythontest.py时,我得到输出为real0m0.067s
我正在使用python和bc分别评估表达式6 ^ 6 ^ 6.
python文件的内容是打印6 ** 6 ** 6.当我执行time python test.py时,我得到输出为
real 0m0.067s
user 0m0.050s
sys 0m0.011s
然后,我运行命令时间echo 6 ^ 6 ^ 6 | bc给了我以下输出
real 0m0.205s
user 0m0.197s
sys 0m0.005s
从这些结果可以清楚地看出,python和bc所占用的sys时间分别为11ms和5ms. bc命令在sys时间级别上优于python,但是当涉及到用户和实时python几乎比bc快4倍.什么可能去那里.我没有优先考虑这些过程.我想了解这种情况.
解决方法:
Python在启动时导入大量文件:
% python -c 'import sys; print len(sys.modules)'
39
其中每个都需要更多次尝试打开Python文件,因为有很多方法可以定义模块:
% python -vv -c 'pass'
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# trying site.so
# trying sitemodule.so
# trying site.py
# trying site.pyc
# trying /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.so
# trying /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sitemodule.so
# trying /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py
# /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.pyc matches /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py
import site # precompiled from /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.pyc
# trying os.so
# trying osmodule.so
# trying os.py
# trying os.pyc
# trying /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.so
# trying /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/osmodule.so
# trying /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py
# /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc matches /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py
import os # precompiled from /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc
...
除了那些内置的“尝试”之外,每个“尝试”都需要os级别/系统调用,并且每个“导入”似乎触发大约8个“尝试”消息. (有很多方法可以使用zipimport减少这种情况,PYTHONPATH中的每个路径都可能需要另外一个调用.)
这意味着在我的机器上启动Python之前,有近200个stat系统调用,“time”将其分配给“sys”而不是“user”,因为用户程序正在等待系统执行操作.
相比之下,和terdon说的那样,“bc”没有那么高的启动成本.看看dtruss输出(我有一台Mac;基于Linux的操作系统的“strace”),我看到bc没有自己进行任何open()或stat()系统调用,除了加载一些共享库是开始,当然Python也是如此.此外,在准备处理任何内容之前,Python有更多要读取的文件.
等待磁盘很慢.
通过执行以下操作,您可以了解Python的启动成本:
time python -c pass
它在我的机器上是0.032秒,而’print 6 ** 6 ** 6’是0.072s,因此启动成本是总时间的1/2,计算转换为十进制是另一半.而:
time echo 1 | bc
需要0.005s,而“6 ^ 6 ^ 6”需要0.184s,因此bc的指数比Python的速度快4倍,即使它比启动速度快7倍.