是shell脚本快,还是python快
看具体需求了,如果只是简单提取,awk或者sed能解决,肯定是shell快
但是要进行复杂运算之类的。就得time去比较了,个人觉得运算类型,python比php强
[转载]
最近看到网上有人对比Python,Shell脚本, C++,主要是拿Python性能说事,个人觉得意义不大。
一个语言有什麼性能问题呢,是背後的实现(标准库,编译器)决定着一切,就像总有人想对比c++和c的效率一样。
还有就是,Python总被人叫做是脚本语言,其实脚本更多指的是批处理命令文件,是shell命令的集合,和python完全
不是一个层次。不同的工具所在层次不同,适用的问题也不同。把不同层次上的东西拉到一起做比较,什麼问题也说明不了。
另外,shell就知道fork,你说他还能干嘛?:-)。
下面先乱侃一通,再以实例探讨下Python的性能问题。
首先,Python是一门动态编程语言,主要亮点是可以提高开发应用的效率。 他是和Java,perl,Ruby等语言同类的。
是做系统集成,Web应用等系统的利器,最近在科学计算领域也是大方光彩(numpy, scipy, sci-kit learn)。
和C/Cplusplus基本不是一个层次的开发工具,他们是做底层系统(基础库,os,ecos就是c++写的,还是用在嵌入式系统中)的,
很多库提供的功能也很基础。但,你可以为Python写c或cpp的模块,提高你的Python系统的整体性能。
其次,Python的主要解释器CPython是用C语言实现的,不同类型(dict,list)和函数实现的算法很不同。如果你的系统对性能很敏感,
那必须了解一些内幕,一个函数输入不同的参数,性能可能相差很大。另外,Python解释器执行Python代码时候,大概经历如下几个阶段:
1) 加载代码文件 2)翻译成AST 3)生成bytecode 4)在PVM(python virtual machine)上执行bytecode,PVM实际是一个基於栈的虚拟机。
其中,前3个阶段看文件代码量,一般就ms级别的消耗,如果你不想浪费,可以使用python -O -m py_compile xx.py命令,
将xx.py先编译为xx.pyo的字节码,然後在调用python xx.pyo执行. PVM你可以简单的想象为一个C语言写的函数,裏面有一个非常大的switch,
根据不同的bytecode内容,执行不同的动作。比如遇到一个打开文件指令,这个函数就会调用libc的库函数,执行c语言的打开文件操作。
其实很多操作python bytecode和c语言之间的性能差异很小的,因为Python的很多功能模块就是直接执行C库的。
再次,随着Python的广泛应用,CPython解释器的性能问题确实越来越严重,特别是数据挖掘,机器学习领域的日趋火热,其中很多优秀工具的实现
都是用Python来做的。为了解决这个问题,Python社区提出了多种不同的解释器,比如针对数值计算的numba,用python实现的python解释器pypy等。
他们的主要目的就是给Python加速,用到的技术有JIT,LLVM。比如numba为python提供了新的decorator,让python函数能在运行时
通过llvm库被翻译成machine code。而CPython的现在主要的目的就变为一个Python解释器的范本,就是提供一个稳定可靠的功能最全的解释器实现参考。
另外,如果某个用Python实现的功能模块的性能很关键,你可以把这个模块先用Cython翻译成C语言代码,然後在编译为可执行程序。当然用Cython,
你也可以在python中更加方便的调用外部C库,保证整个系统的性能。所以,很多Python系统的执行会越来越快,但并不是Python快了,而是後面的支持
越来越强大了。
最後,Python就是和Java类似的一门语言,不要把他理解为是一种脚本。刚开始把他理解为脚本,可能是因为python提供了一个命令行工具,让人可以输入
python代码,并立刻见到结果。其实,这只不过python给你提供的一个优秀的工具之一而已。Python在各个领域的使用越来越广泛,开源资源也越来越多:
1. 大规模分布式计算disco,提供和hadoop类似的mapreduce模型 htt p:/ /discoprojec t.o rg/
2. 科学计算/可视化 numpy,scipy, matplotlib
3. 数据挖掘orange, sci-kit learn scikit-learn.sourceforg e.n et
4. Web开发 django project
所有IT领域,基本都能找到Python的痕迹。
说了这麼多,举一个文本处理的例子,就是计算文本中第3列数据的和,来看看Python的功力,特别是性能方面的问题,
对比参考就是awk神器,其实拿awk做对比不是很公平,毕竟awk是优化再优化的工具(没动力看他的实现,我猜的:)),
应该自己写个c语言版本的。
样本文件有1000万行,格式如下:
data.txt:
d0 sp 0
d1 sp 1
d2 sp 2
d3 sp 3
d4 sp 4
d5 sp 5
d6 sp 6
d7 sp 7
d8 sp 8
d9 sp 9
先看awk的结果:
$ time cat data.txt |awk '{ sum+=$3} END {print sum}'
49976634308700
real0m3.662s
user0m3.576s
sys0m0.240s
1000万行3秒,效率果真高。
再看Python的,我做了四个版本。
Python代码版本(1):
import sys
def data_sum():
datasum = 0
for line in sys.stdin:
raw = line.split()
datasum += int(raw[2],10)
print datasum
if __name__ == "__main__":
data_sum()
Python代码版本(2):
import sys
def data_sum():
datasum = 0
for line in sys.stdin:
raw = line.split()
datasum += int(raw[2])
print datasum
if __name__ == "__main__":
data_sum()
Python代码版本(3):
def data_sum():
datasum = 0
for line in sys.stdin:
datasum += int(‘2’,10)
print datasum
if __name__ == "__main__":
data_sum()
Python代码版本(4):
import sys
def data_sum():
datasum = 0
for line in sys.stdin:
raw = line.split()
print datasum
if __name__ == "__main__":
data_sum()
版本(1)执行结果:
首先将python代码编译成字节码,运行看看
$python -O -m py_compile datasum.py
$ time cat data.txt |python datasum.pyo
49976634308700
real0m7.151s
user0m7.088s
sys0m0.192s
再试试直接运行python代码
$ time cat data.txt |python datasum.py
49976634308700
real0m7.323s
user0m7.228s
sys0m0.212s
两种方法大概有个毫秒级别的差异,主要消耗在cpython把python代码翻译成ast阶段,感兴趣可以自己编译一个cpython验证下。
还有pypy,看看他的JIT和stackless效果如何。
$ time cat data.txt | pypy-c datasum.py
49976634308700
real0m4.649s
user0m4.556s
sys0m0.224s
怎样?比awk版本就慢了1秒钟。我已经非常满意了。下面再试试其他版本,顺便看看到底Python慢在了哪裏。
版本(2):
$ time cat data.txt |python datasum.py
49976634308700
real0m9.111s
user0m9.025s
sys0m0.220s
$ time cat data.txt | pypy-c datasum.py
49976634308700
real0m4.694s
user0m4.588s
sys0m0.248s
版本(2)直接就比版本(1)慢了2秒。就差了一个base参数而已,原因看下Cpython的代码就清楚了(Python/bltinmodule.c)。
加了base的,直接调用: x = PyOS_strtol(s, &end, base);
不加base的,要通过PyNumber_Int等一列内部类型处理函数,最後到达PyOS_strtol。
版本(3):
$ time cat data.txt |python datasum.py
20000000
real0m3.127s
user0m3.044s
sys0m0.188s
$ time cat data.txt | pypy-c datasum.py
20000000
real0m2.393s
user0m2.320s
sys0m0.196s
版本(4):
$ time cat data.txt |python datasum.py
0
real0m3.920s
user0m3.852s
sys0m0.180s
$ time cat data.txt | pypy-c datasum.py
0
real0m3.324s
user0m3.208s
sys0m0.252s
通过对比版本(3)和版本(4)可以发现,Python主要慢在了split函数这裏,也就是提取第3列这个动作上。
初步想想,用C语言确实可以做到速度更快,但用Python没想到什麼好办法,正则表达式会更慢。
上面都是用Python的解释器来执行代码的,下面把版本(1)用Cython编译成C语言,看看效果如何:
$ cython --embed -o datasum.c datasum.py
$ gcc -o datasum datasum.c -I/usr/include/python2.7 -lpython2.7
$ time cat data.txt |./datasum
49976634308700
real0m6.332s
user0m6.272s
sys0m0.192s
比pypy还是慢了一些,pypy在代码生成上有些优化,cython基本就是translate。
总结下就是:
Python是快速原型开发的利器,如果你对性能有要求,那麼就用他的各种优化他,Python不会辜负你的。
当你的领导/客户给你很大的deadline压力时候,Python就是你的救命草,呵呵。
当然,某些简单功能,比如本文的例子,用awk就可以了嘛,干嘛费力气优化python,:-)。
如果是计算类型,python快
PowerShell系列(五):PowerShell通过脚本方式运行笔记
PowerShell系列(五):掌握PowerShell脚本执行的高效方式 在日常运维工作中,PowerShell脚本执行是不可或缺的工具。它就像编写代码那样,先编写好脚本,然后通过脚本文件来执行各种运维任务,极大地方便了任务的管理和迁移。以下是四种常见的PowerShell脚本执行方式:1. 当前文件夹运行在脚本文件所在的目录下,...
什么是脚本语言
2. 用途 脚本语言广泛应用于各种领域。例如,网页开发中的JavaScript用于实现网页的交互功能,使得网页能够响应用户的操作。此外,系统管理员经常使用Shell脚本语言来自动化日常的系统管理任务,如文件操作、数据备份等。在软件测试领域,脚本语言也常被用于编写自动化测试脚本,以提高测试效率。3. 常见脚本语言...
sh是什么文件
sh文件是一种Shell脚本文件。Shell脚本是一种由Shell执行的脚本程序,通常用于自动化计算机系统中的任务。而sh文件就是包含这些脚本的文本文件,其后缀名为“.sh”,表示这是一个Shell脚本文件。下面详细解释sh文件及其相关内容:Shell脚本简介:Shell是操作系统的一个命令行解释器,它接收用户输入...
windows shell脚本命令中,暂停一段时间用哪个命令?
VBS脚本中可以这样:WScript.Sleep 3000 时间单位为毫秒(milliseconds),因此,上面这句就是暂停3秒。DOS批处理脚本中只能用ping命令来延时(这个时间是很不精确的)。例如:ping 127.0.0.1 -n 2 -w 1000 > nul 另外,Windows 2003 Resource Kit 提供了sleep的功能,你可以去微软网站下载安装。
SHELL写个脚本,以达到每隔2小时对数据进行导出备份~~同时对24小时后的...
先写一个文件,比如叫abc:MIN HOUR DAY MONTH DAYOFWEEK COMMAND 每两个小时 0 *\/2 * * * ls ls只是一个例子,假如你想要执行的备份数据的命令即可,然后在root权限下:crontab file abc 即可
1、 编写shell脚本,实现如下功能:(
!\/bin\/bash if [[ $1 = $2 ]];then echo "$1 = $2"exit 0 elif [[ $1 > $2 ]];then echo "$1 > $2"exit 0 fi echo "$1 < $2 "
编写以下shell脚本,保存为\/exam\/shell目录下的(1.sh 2.sh 3.sh...
1.取出\/etc\/passwd文件中的用户名和UID的字段,并将输出结果以UID的大小顺序排列;[root@localhost shell]# cat 1.sh !\/bin\/bash awk -F: '{print $3,$1}' \/etc\/passwd|sort -n 2.判断输入的数值是奇数还是偶数;[root@localhost shell]# cat 2.sh !\/bin\/bash read num if [ `...
能否把这个shell脚本改进一下,让它每隔1000次输出一次
!\/bin\/bashfor ((i=1;i<10000;i++))do let n=i%1000 [ $n -eq 0 ] && echo $idone只要循环变量i的值是1000的整数倍(除以1000余数为0,即取模运算结果为0),就输出。由于你的循环取值范围不包括0和10000,所以不会输出0和10000。或者,修改循环条件也可以,i从1000开始,i++...
perl 、shell、python三种脚本语言那种好学、易用
perl、shell、python三种脚本语言的区别:1、适用不同:shell是操作linux的基本,是必须学的。学shell就是学linux命令。perl有强大的正则表达式支持,对于文本处理非常强悍,玩linux不得不学。python作用一种面向对象的,能作为linux脚本的语言,学好之后能帮你很好地完成工作。2、特点不同:Perl是一种能...
用shell程序写出一个脚本,内容如下:+输入y,Yyes,Yes中一个,则屏幕上...
以下是一个简单的Shell脚本,用于根据用户输入输出问号:使用方法:打开终端或命令行界面;进入脚本所在目录;输入 .\/script.sh(假设脚本文件名为 script.sh)并按回车键;根据提示输入 y、Y、yes 或 Yes 中的一个,并按回车键;如果输入有效,则屏幕上会输出一个问号;否则会提示输入无效。
左丘荣伤科: 如果是调用系统相关命令,肯定shell快 如果是计算类型,python快
合水县17642682743: shell脚本做文本解析同php和python比哪个效率更高 - ?
左丘荣伤科: 普通功能,shell的效率高,因为这些经典命令内部大多是C/C++实现的.但在一些偏僻或者复杂功能中,限于这些命令本身的功能,需要“曲线救国”,反复倒腾数据才能达到最终结果.这时候,直接用php、python,速度就更快.
合水县17642682743: 运维新手们,别再问需不需要学PYTHON了 - ?
左丘荣伤科: 为什么要学 PYTHON ?PYTHON 第一是个非常牛 B 的脚本语言, 能满足绝大部分自动化运维的需求,又能做后端 C/S 架构,又能用 WEB 框架快速开发出高大上的 WEB 界面,只有当你自已有能力做出一套运维自动化系统的时候,你的价值...
合水县17642682743: python是不是脚本语言 - ?
左丘荣伤科: Python是一种解释性的脚本语言的,但是Python相比shell程序又更加灵活,Python可以将脚本编译成二进制码,然后直接运行,加快代码的运行速度,但是python也支持解释器直接解释源码运行
合水县17642682743: Linux运维学perl还是python好 - ?
左丘荣伤科: 同样是懒散运维表示.选python.两种我都曾经用过.1.可以肯定使用py的人越来越多,因为入门相当容易,这适合你的脚本被其他人理解,或者共同维护.2.就功能性来说,其实脚本语言都差不多.但是py有更好的调试机制,perl语法可以说约束太宽,我是觉得语法太随意,规范化的py看起来更简单易懂,py在面向对象的写法上更容易.3.两个官方文档我都看过,perl内容没有py完整,perl有些地方很简单的带过.当然py2跟3有些差别,但是不大,perl6跟perl5的差别更大呢.4.py作为很多开发项目的辅助语言现在来说会更流行一些,不管是github还是其他地方.所以,你能找到的帮助,解决问题的思路也比perl广.
合水县17642682743: 本人在学linux c编程,想再学一门脚本技术,是先学习python好,还是先学shell好呢,注意是在linux下的.?
左丘荣伤科: 1 linux下编程必须要懂shell ,建议先把shell学好 2 学好shell 脚本,linux的 的一些命令操作就变得简单易行了 3 shell脚本比较容易好学,学好好python就也显得更容易
合水县17642682743: 我是做java的,看到好多招聘要求会shell 或者 python ,我知道这是脚本语言,但是他究 - ?
左丘荣伤科: 我在一家互联网公司工作,工作性质是后端服务开发和数据构建.开发语言C++,Python,PHP都涉及过.我的观点是,Shell和Python是软件工程师的基本技能之一.Shell是UNIX下的脚本语言,长用于集成命令和操作用.而Python是高级脚本语言...
合水县17642682743: Python是脚本还是语言 - ?
左丘荣伤科: Python是脚本语言. Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发. Python的设计哲学是...
合水县17642682743: Perl与Python的区别和优缺点到底在哪 - ?
左丘荣伤科: (1)设计一个语言的初始目的决定了该语言将会内建什么功能: perl初始是Larry为了格式化处理文本而创建的,所以内建了正则 ;python内建一个复数型别,猜测Guido最初一定是为了数值计算而创建了python.因此perl擅长文字处理,python擅...
合水县17642682743: 为什么要使用Shell脚本 - ?
左丘荣伤科: 使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象.缺点是:它们的效率通常不如编译型语言.不过权衡之下,通常使用脚本编程还是值得的:花一个小时写成的简单脚本,同样的功能...