Python与Bash - 哪种任务中各自的性能更胜一筹?
显然,Python 更容易上手,网上搜索一下就能找到很多这样的说法。因为 Python 是字节编译的,所以通常运行速度更快。我甚至找到了一些资料,声称在基于字典的操作中,你可以看到超过 2000% 的性能提升。
你对此有什么看法?在什么样的任务中,每种语言的表现差异明显呢?
11 个回答
当你在写脚本的时候,性能通常不是最重要的考虑因素。
如果你在意性能,那么“Python和Bash哪个更好”这个问题其实没有意义。
Python:
+ 写起来更简单
+ 维护起来更方便
+ 代码重用更容易(试试在sh
中找到一种通用且不容易出错的方法来包含公共代码吧,我敢打赌你做不到)
+ 也可以做面向对象编程!
+ 处理参数更简单。其实也不算特别简单,但Python有内置的argparse
工具,能帮你处理参数。
- 讨厌的“subprocess”。试着把命令串联起来,看看你的代码会变得多丑,尤其是当你在意退出代码的时候。
Bash:
+ 确实很常见,正如之前提到的。
+ 命令串联很简单。这是把不同命令简单连接在一起的方法。而且Bash
(不是sh
)有一些改进,比如pipefail
,所以串联起来的代码既短又易懂。
+ 不需要安装第三方程序,可以直接执行。
- 哎呀,里面有太多陷阱了。IFS、CDPATH……数不胜数。
如果你写的脚本超过100行代码:选择Python
如果你需要在脚本中处理路径:选择Python(3)
如果你需要类似alias
但稍微复杂一点的功能:选择Bash/sh
无论如何,你应该尝试两者,了解它们各自的能力。
也许这个回答可以扩展到打包和IDE支持的方面,但我对此不太了解。
总之,你总是要在两个糟糕的选择中做决定。记住,就在几年前,Perl曾被视为新的希望。现在它在哪里呢?
一般来说,bash在没有python的环境下表现得更好。 :)
说真的,我每天都要用这两种语言,如果可以选择,我会立刻选择python而不是bash。不过,有时候我不得不在一些“小”平台上使用bash,因为有人(在我看来是错误的)认为python“太大”了,装不下。
虽然bash在某些特定任务上可能比python快,但在开发速度和维护方面,它永远无法和python、ruby或lua等语言相比(尤其是当代码超过10行时)。bash相对于python等语言唯一的优势就是它的普遍性。
典型的主机流程...
Input Disk/Tape/User (runtime) --> Job Control Language (JCL) --> Output Disk/Tape/Screen/Printer
| ^
v |
`--> COBOL Program --------'
典型的Linux流程...
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 |
: :
Shell是Linux的粘合剂
Linux的shell,比如sh/ksh/Bash/等,提供了输入/输出/流程控制的功能,跟老式主机的作业控制语言有点像,但功能更强大!它们本身就是图灵完备的语言,同时优化了数据和控制信息在不同程序之间的传递,这些程序可以用操作系统支持的任何语言编写。
大多数Linux应用程序,不管主要是用什么语言写的,都依赖于shell脚本,而Bash已经成为最常用的。点击桌面上的图标通常会运行一个短小的Bash脚本。这个脚本直接或间接地知道所有需要的文件在哪里,并设置变量和命令行参数,最后调用程序。这就是shell最简单的用法。
不过,Linux之所以能被称为Linux,离不开成千上万的shell脚本,这些脚本负责启动系统、响应事件、控制执行优先级,以及编译、配置和运行程序。很多脚本都相当大且复杂。
Shell提供了一种基础设施,让我们可以在运行时将预先构建的组件链接在一起,而不是在编译时。这些组件本身就是独立的程序,可以单独使用,也可以与其他组件组合使用,而无需重新编译。调用它们的语法和Bash内置命令没有区别,实际上有很多内置命令在系统中也有独立的可执行文件,通常还提供额外的选项。
在性能上,Python和Bash之间没有语言层面的差异。完全取决于各自的代码编写方式以及调用了哪些外部工具。
像awk, sed, grep, bc, dc, tr等知名工具在这两种语言中执行这些操作时,任何一种都能表现得更好。因此,对于没有图形用户界面的任务,使用Bash更为合适,因为用Bash调用和传递数据给这些工具比用Python更简单高效。
性能
整体的处理能力和响应速度是否比相应的Python更好,取决于Bash脚本调用了哪些程序,以及这些程序是否适合它们被赋予的子任务。更复杂的是,Python和大多数语言一样,也可以调用其他可执行文件,虽然这样做比较麻烦,因此不常用。
用户界面
在用户界面方面,Python明显更胜一筹。这使得它成为构建本地或客户端-服务器应用程序的优秀语言,因为它原生支持GTK图形,并且比Bash更直观。
Bash只理解文本。要实现图形用户界面,必须调用其他工具,并从中传递数据。使用Python脚本是一种选择。更快但灵活性较低的选择是像YAD, Zenity, 和 GTKDialog这样的二进制文件。
虽然像Bash这样的shell可以很好地与像Yad、GtkDialog(嵌入式XML样式的GTK+函数接口)、dialog和xmessage等图形用户界面工具配合使用,但Python更强大,更适合复杂的图形用户界面窗口。
总结
使用shell脚本构建程序就像用现成的组件组装电脑,跟桌面PC的组装方式类似。
而用Python、C++或其他大多数语言构建程序,更像是通过焊接芯片(库)和其他电子元件来组装电脑,类似于智能手机的组装方式。