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命令的语法没有什么区别,实际上有很多内置的命令,系统上也有一个独立的可执行文件,通常有额外的选项。

PythonBash在性能上没有语言差异。 完全取决于每个代码是如何编码的以及调用哪些外部工具。

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一样组装计算机。

使用PythonC ++或其他任何语言来构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。