Python vs Bash – 每种types的任务在哪一种性能方面都有所改善?
很明显,Python更加用户友好,在google上快速search显示了很多结果,因为Python是字节编译通常更快。 我甚至发现这一点 ,声称你可以看到基于字典的操作超过2000%的改善。
你在这件事上有什么经验? 每种types的任务都是明确的赢家?
典型的主机stream程…
Input Disk/Tape/User (runtime) --> Job Control Language (JCL) --> Output Disk/Tape/Screen/Printer | ^ v | `--> COBOL Program --------'
典型的Linuxstream程…
Input Disk/SSD/User (runtime) --> sh/bash/ksh/zsh/... ----------> Output Disk/SSD/Screen/Printer | ^ v | `--> Python script --------' | ^ v | `--> awk script -----------' | ^ v | `--> sed script -----------' | ^ v | `--> C/C++ program --------' | ^ v | `--- Java program ---------' | ^ v | : :
壳是Linux的胶水
Linux shell像sh / ksh / bash / …提供input/输出/stream量控制指定function,就像旧的大型机Job Control Language …一样,但是使用类固醇! 它们本身就是图灵完整的语言 ,同时经过优化,可以有效地将数据和控制传递到其他正在运行的进程中,并以O / S支持的任何语言编写。
大多数Linux应用程序,不pipe大部分程序是用什么语言编写的,都依赖于shell脚本, Bash已经成为最常见的了。 单击桌面上的图标通常会运行一个简短的Bash脚本。 该脚本直接或间接地知道所需文件的位置,并设置variables和命令行参数,最后调用程序。 这是一个shell最简单的用法。
然而,我们所知道的Linux几乎不是Linux,没有成千上万的启动系统,响应事件,控制执行优先级和编译,configuration和运行程序的shell脚本。 其中许多是相当大和复杂的。
壳提供了一个基础设施,使我们可以使用运行时链接在一起的预构build组件,而不是编译时间。 这些组件是独立的程序,可以单独使用或以其他组合方式使用,无需重新编译。 调用它们的语法与Bash内build命令的语法没有什么区别,实际上有很多内置的命令,系统上也有一个独立的可执行文件,通常有额外的选项。
Python和Bash在性能上没有语言差异。 完全取决于每个代码是如何编码的以及调用哪些外部工具。
像awk,sed,grep,bc,dc,tr等任何一个众所周知的工具都将会在这两种语言中做出这些操作。 Bash然后是没有graphics用户界面的东西的首选,因为调用和传递数据从Bash之类的工具比Python更容易,更高效。
性能
这取决于Bash shell脚本调用哪些程序,以及它们是否适合于它们所提供的子任务,无论整体吞吐量和/或响应能力会比等效的Python好还是差。 复杂的事情Python和大多数语言一样,也可以调用其他的可执行文件,虽然它比较麻烦,所以不常用。
用户界面
Python是明显的赢家的一个领域是用户界面。 这使它成为构build本地或客户端 – 服务器应用程序的绝佳语言,因为它本身支持GTKgraphics,而且比Bash更直观。
Bash只理解文本。 必须调用其他工具来从GUI传回数据。 Python脚本是一种select。 YAD,Zenity和GTKDialog等二进制文件更快但更不灵活。
虽然像Bash这样的shell可以很好地与像Yad , GtkDialog(embedded的类似于GTK +函数的类似于XML的接口) , 对话框和xmessage一样的GUI工作 ,但是Python通常更简单,function更强大。
概要
使用shell脚本来构build就像使用现成的组件和桌面PC一样组装计算机。
使用Python , C ++或其他任何语言来构build更像是通过将芯片(库)和其他电子部件以智能手机的方式焊接在一起来构build计算机。
一般来说,bash只能在python不可用的环境中比python更好。 🙂
说真的,我不得不每天处理这两种语言,如果给出select的话,就会立刻把python放在bash上。 唉,我不得不在某些“小”的平台上使用bash,因为有人(错误地,恕我直言)决定Python是“太大”,以适应。
虽然对于某些select任务来说,bash可能比python更快,但是用它来开发或者维护起来不会那么快(至less在你过去10行代码之后)。 Bash的唯一强大的python或ruby或卢阿等,是它的无处不在。
在bash和Python都是明智select的情况下, 开发者效率对我来说更重要。
有些任务适合于bash,有些则适合Python。 对于我来说,启动一些bash脚本并将其改为Python,这在几个星期内就会发生。
Python有一个很大的优势,就是在文件名处理的angular落里,而对于普通的脚本需求,它有glob , shutil , subprocess等等。
Bash主要是一个批处理/ shell脚本语言,对于各种数据types以及控制结构中各种各样的怪癖(更不用说兼容性问题)的支持要less得多。
哪个更快? 也不是,因为你不把苹果比作苹果。 如果您必须对ascii文本文件进行sorting,并且您正在使用zcat,sort,uniq和sed等工具,那么您将会吸取Python性能。
但是,如果您需要一个支持浮点和各种控制stream的正确编程环境,那么Python就会胜出。 如果你写了一个在Bash和Python中的recursionalgorithm,那么Python版本将赢得一个数量级或更多。
性能方面的bash在进程启动时间内优于python。
以下是运行Linux Mint的核心i7笔记本电脑的一些测量结果:
Starting process Startup time empty /bin/sh script 1.7 ms empty /bin/bash script 2.8 ms empty python script 11.1 ms python script with a few libs* 110 ms
* Python加载的库是:os,os.path,json,时间,请求,线程,subprocess
这显示了巨大的差异,但是如果执行时间必须做任何明智的事情,那么执行时间会很快降低,因为它通常必须调用外部进程。
如果你关心性能,只能使用bash:
- 真的很简单,经常被称为脚本
- 主要调用其他进程的脚本
- 当手动pipe理操作和脚本之间需要最小的摩擦时 – 快速检查一些命令并将它们放在file.sh中
如果你想用最小的努力拼凑一个快速的工具,bash是好的。 对于一个应用程序的包装,bash是非常宝贵的。
任何可能让你反复追加改进的东西可能(虽然不总是)更适合Python这样的语言,因为超过1000行的Bash代码会很难维护。 Bash代码在debugging时也很烦人…….
这些问题的部分问题是,从我的经验来看,shell脚本通常都是自定义任务。 我已经遇到很less的shell脚本任务,已经有了一个免费的解决scheme。
在编写脚本时,性能并不重要(大多数情况下)。
如果你关心性能“Python vs Bash”是一个虚假的问题。
Python :
+写起来更容易
+更容易维护
+更简单的代码重用(尝试find通用的防错方式来包含通用代码的文件,我敢说)
+你也可以做OOP!
+更简单的参数parsing。 好吧,确切地说,并不容易。 我的口味仍然过于罗嗦,但python内置了argparse
设施。
– 丑陋的“子过程”。 尝试链接命令,不要stream泪,你的代码会变得多糟糕。 特别是如果你关心退出代码。
Bash :
+无处不在,正如前面所说的那样。
+简单的命令链接。 这就是如何以简单的方式将不同的命令粘合在一起。 另外Bash
(不是sh
)有一些改进,比如pipefail
,所以链接非常简短和expression。
+不需要安装第三方程序。 可以马上执行。
– 上帝,它充满了陷阱。 IFS,CDPATH ..成千上万。
如果写一个大于100 LOC的脚本:selectPython
如果在脚本中需要path操作:selectPython(3)
如果需要alias
但有点复杂:selectBash / sh
无论如何,人们应该尝试双方的想法是什么,他们的能力。
也许答案可以用包装和IDE支持点来扩展,但是我对这方面并不熟悉。
一如既往,你必须从土豆三明治和巨大的冲洗select。 请记住,就在几年前,Perl是新的希望。 现在在哪里。
有两个场景的Bash性能至less是相等的我相信:
- 脚本命令行工具
- 只需要很短时间执行的脚本; Python解释器的启动比操作本身需要更多的时间
也就是说,我通常不关心脚本语言本身的性能。 如果性能是一个真正的问题,你不会编写脚本,但可能会编程(可能在Python中)。
我不知道这是否准确,但我发现python / ruby对于有很多math计算的脚本来说效果更好。 否则,你必须使用dc
或其他“任意精度计算器”。 这只是一个非常大的痛苦。 使用python,你可以对浮点数和整数进行更多的控制,而且执行大量计算并且有时更容易。
特别是,我永远不会用bash脚本来处理二进制信息或字节。 相反,我会使用类似python(也许)或C ++甚至Node.JS。