Python与Bash - 哪种任务中各自的性能更胜一筹?

129 投票
11 回答
153938 浏览
提问于 2025-04-15 20:18

显然,Python 更容易上手,网上搜索一下就能找到很多这样的说法。因为 Python 是字节编译的,所以通常运行速度更快。我甚至找到了一些资料,声称在基于字典的操作中,你可以看到超过 2000% 的性能提升。

你对此有什么看法?在什么样的任务中,每种语言的表现差异明显呢?

11 个回答

42

当你在写脚本的时候,性能通常不是最重要的考虑因素。
如果你在意性能,那么“Python和Bash哪个更好”这个问题其实没有意义。

Python:
+ 写起来更简单
+ 维护起来更方便
+ 代码重用更容易(试试在sh中找到一种通用且不容易出错的方法来包含公共代码吧,我敢打赌你做不到)
+ 也可以做面向对象编程!
+ 处理参数更简单。其实也不算特别简单,但Python有内置的argparse工具,能帮你处理参数。
- 讨厌的“subprocess”。试着把命令串联起来,看看你的代码会变得多丑,尤其是当你在意退出代码的时候。

Bash:
+ 确实很常见,正如之前提到的。
+ 命令串联很简单。这是把不同命令简单连接在一起的方法。而且Bash(不是sh)有一些改进,比如pipefail,所以串联起来的代码既短又易懂。
+ 不需要安装第三方程序,可以直接执行。
- 哎呀,里面有太多陷阱了。IFS、CDPATH……数不胜数。

如果你写的脚本超过100行代码:选择Python
如果你需要在脚本中处理路径:选择Python(3)
如果你需要类似alias但稍微复杂一点的功能:选择Bash/sh

无论如何,你应该尝试两者,了解它们各自的能力。

也许这个回答可以扩展到打包和IDE支持的方面,但我对此不太了解。

总之,你总是要在两个糟糕的选择中做决定。记住,就在几年前,Perl曾被视为新的希望。现在它在哪里呢?

83

一般来说,bash在没有python的环境下表现得更好。 :)

说真的,我每天都要用这两种语言,如果可以选择,我会立刻选择python而不是bash。不过,有时候我不得不在一些“小”平台上使用bash,因为有人(在我看来是错误的)认为python“太大”了,装不下。

虽然bash在某些特定任务上可能比python快,但在开发速度和维护方面,它永远无法和python、ruby或lua等语言相比(尤其是当代码超过10行时)。bash相对于python等语言唯一的优势就是它的普遍性。

115

典型的主机流程...

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内置命令没有区别,实际上有很多内置命令在系统中也有独立的可执行文件,通常还提供额外的选项。

在性能上,PythonBash之间没有语言层面的差异。完全取决于各自的代码编写方式以及调用了哪些外部工具。

awk, sed, grep, bc, dc, tr等知名工具在这两种语言中执行这些操作时,任何一种都能表现得更好。因此,对于没有图形用户界面的任务,使用Bash更为合适,因为用Bash调用和传递数据给这些工具比用Python更简单高效。

性能

整体的处理能力和响应速度是否比相应的Python更好,取决于Bash脚本调用了哪些程序,以及这些程序是否适合它们被赋予的子任务。更复杂的是,Python和大多数语言一样,也可以调用其他可执行文件,虽然这样做比较麻烦,因此不常用。

用户界面

在用户界面方面,Python明显更胜一筹。这使得它成为构建本地或客户端-服务器应用程序的优秀语言,因为它原生支持GTK图形,并且比Bash更直观。

Bash只理解文本。要实现图形用户界面,必须调用其他工具,并从中传递数据。使用Python脚本是一种选择。更快但灵活性较低的选择是像YAD, Zenity, 和 GTKDialog这样的二进制文件。

虽然像Bash这样的shell可以很好地与像YadGtkDialog(嵌入式XML样式的GTK+函数接口)dialogxmessage等图形用户界面工具配合使用,但Python更强大,更适合复杂的图形用户界面窗口。

总结

使用shell脚本构建程序就像用现成的组件组装电脑,跟桌面PC的组装方式类似。

而用PythonC++或其他大多数语言构建程序,更像是通过焊接芯片(库)和其他电子元件来组装电脑,类似于智能手机的组装方式。

通常,最佳结果是通过多种语言的组合来实现,每种语言都能发挥其最佳性能。一位开发者称之为"多语言编程"。

撰写回答