标签:python performance bc process-management
我正在使用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倍.
标签:python,performance,bc,process-management 来源: https://codeday.me/bug/20190808/1623447.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。