显然Python更加用户友好,谷歌上的快速搜索显示许多结果,因为Python字节编译通常更快。我甚至发现this声称你可以看到基于字典的操作有超过2000%的改进。
您对此事有何经验?在哪种任务中,每个人都是明显的赢家?
答案 0 :(得分:76)
典型的大型机流程
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 |
: :
大多数Linux应用程序,无论编写程序的大部分语言,都依赖于shell脚本, Bash 已成为最常见的。单击桌面上的图标通常会运行简短的 Bash 脚本。该脚本直接或间接地知道所需文件的位置,并设置变量和命令行参数,最后调用程序。这是shell最简单的用法。
我们所知道的Linux然而,如果没有成千上万的shell脚本来启动系统,响应事件,控制执行优先级以及编译,配置和运行程序,Linux就不会是Linux。其中许多都非常庞大和复杂。
Shell提供了一种基础结构,允许我们使用在运行时而不是编译时链接在一起的预构建组件。这些组件本身就是独立的程序,可以单独使用或以其他组合方式使用而无需重新编译。调用它们的语法与 Bash 内置命令的语法无法区分,实际上有许多内置命令,系统上还有一个独立的可执行文件,通常还有其他选项。 / p>
Python 与 Bash 在性能上没有语言差异。它完全取决于每个编码方式以及调用哪些外部工具。
任何众所周知的工具,如 awk,sed,grep,bc,dc,tr,等,都会在任何一种语言中执行这些操作。 Bash 则适用于没有图形用户界面的任何内容,因为从 Bash 而非 Python的工具调用和传递数据更容易,更有效强>
这取决于 Bash shell脚本调用哪些程序以及它们对子任务的适用性,无论整体吞吐量和/或响应性是否优于等效的 Python < / strong>即可。使问题复杂化 Python 与大多数语言一样,也可以调用其他可执行文件,尽管它更麻烦,因此不常用。
Python 是明显赢家的一个领域是用户界面。这使它成为构建本地或客户端服务器应用程序的优秀语言,因为它原生支持GTK图形,并且比 Bash 更直观。
Bash 只能理解文字。必须为GUI和从它们传回的数据调用其他工具。 Python 脚本是一种选择。更快但不太灵活的选项是像 YAD,Zenity和GTKDialog 这样的二进制文件。
像 Bash 这样的shell适用于Yad,GtkDialog (embedded XML-like interface to GTK+ functions),dialog和xmessage等GUI, Python 通常更容易,更有能力。
使用shell脚本构建就像组装具有现成组件的计算机一样,就像桌面PC一样。
使用 Python 构建, C ++ 或大多数其他语言更像是通过将芯片(库)和其他电子部件焊接到智能手机的方式来构建计算机。
答案 1 :(得分:70)
通常,bash仅在python不可用的环境中比python更好。 :)
说真的,我必须每天处理这两种语言,并且如果给出选择,将立即通过bash使用python。唉,我被迫在某些“小”平台上使用bash,因为有人(错误地,恕我直言)认为python“太大”不适合。
虽然对于某些选择任务来说bash可能比python更快,但它开发速度永远不会那么快,或者很容易维护(至少在你获得超过10行代码之后)。 Bash唯一的优点是rt python或ruby或lua等,是它无处不在。
答案 2 :(得分:30)
开发人员效率对于我来说更重要的是bash和Python都是明智的选择。
有些任务适合bash,其他任务适合Python。对于我来说,作为一个bash脚本启动一些东西并将其更改为Python,并且它会在几周内发展,这也是不寻常的。
Python的一大优势在于文件名处理方面的优势,而它有glob,shutil,subprocess以及其他常见脚本需求。
答案 3 :(得分:22)
编写脚本时,性能无关紧要(在大多数情况下) 如果你关心性能'Python vs Bash'是一个错误的问题。
<强>的Python 强>:
+更容易写
+更容易维护
+更简单的代码重用(尝试找到通用的防错方式,在sh
中包含具有公共代码的文件,我敢于你)
+你也可以用它做OOP!
+更容易解析的参数。好吧,不是更容易,确切。根据我的口味,它仍然过于冗长,但是python内置了argparse
设施
- 丑陋的'subprocess'。尝试链接命令,而不是哭河,你的代码将变得多么丑陋。特别是如果您关心退出代码。
<强>击强>:
正如之前所说的那样,无所不在
+简单的命令链接。这就是你如何以简单的方式将不同命令粘合在一起。此外Bash
(不是sh
)也有一些改进,例如pipefail
,因此链接非常简短且富有表现力。
+不要求安装第三方程序。可以马上执行。
- 上帝,它充满了陷阱。 IFS,CDPATH ......成千上万。
如果编写一个大于100 LOC的脚本:选择 Python
如果需要在脚本中进行路径操作:选择 Python(3)
如果有人需要alias
但有点复杂:选择 Bash / sh
无论如何,人们应该尝试双方来了解他们的能力。
也许答案可以通过打包和IDE支持点进行扩展,但我对这方面并不熟悉。
一如既往,您必须选择炖三明治和巨型冲洗。 请记住,就在几年前,Perl是新的希望。它现在在哪里。
答案 4 :(得分:17)
性能方面的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加载的libs是:os,os.path,json,time,requests,threading,subprocess
这显示了巨大的差异,但是如果它必须做任何合理的事情,那么bash执行时间会迅速降低,因为它通常必须调用外部进程。
如果您关心性能,请仅使用bash:
答案 5 :(得分:15)
Bash主要是一种批处理/ shell脚本语言,对各种数据类型和控制结构周围的各种怪癖的支持要少得多 - 更不用说兼容性问题了。
哪个更快?也不是,因为你不是在这里比较苹果和苹果。如果您必须对ascii文本文件进行排序,并且您使用的是zcat,sort,uniq和sed等工具,那么您将明智地使用Python性能。
但是,如果您需要一个支持浮点和各种控制流的正确编程环境,那么Python将获胜。如果您在Bash和Python中写过一个递归算法,那么Python版本将获得一个数量级或更多。
答案 6 :(得分:10)
如果你想用最小的努力拼凑一个快速的实用程序,bash是好的。对于应用程序的包装器,bash是非常宝贵的。
任何可能让你一遍又一遍地回来添加改进的东西可能(虽然并不总是)更适合像Python这样的语言,因为包含超过1000行的Bash代码很难维护。调试时,Bash代码也会因调试而烦恼.......
根据我的经验,这些问题的部分问题是shell脚本通常都是自定义任务。我已经遇到的shell脚本编写任务很少,而且已经有了免费提供的解决方案。
答案 7 :(得分:8)
有两个场景,Bash表现至少相等,我相信:
尽管如此,我通常并不关心脚本语言本身的性能。如果性能是一个真正的问题,你不需要编写脚本,而是编程(可能是Python)。
答案 8 :(得分:1)
我不知道这是否准确,但我发现python / ruby对于具有大量数学计算的脚本效果更好。否则,您必须使用dc
或其他“任意精度计算器”。它只是一个非常大的痛苦。使用python,你可以更好地控制浮点数和整数,并且有时候执行大量计算要容易得多。
特别是,我永远不会使用bash脚本来处理二进制信息或字节。相反,我会使用python(可能)或C ++甚至Node.JS。
答案 9 :(得分:0)
我之所以发布这个最新答案,主要是因为Google喜欢这个问题。
我认为问题和背景确实应该与工作流程有关,而不是工具。总体理念始终是“使用正确的工具完成工作”。但是在此之前,许多人常常在工具迷失时忘记了这一点:“把工作做好。”
当我遇到一个尚未完全定义的问题时,我几乎总是从Bash开始。我已经解决了大型Bash脚本中易读且可维护的棘手问题。
但是问题什么时候开始超过要求Bash执行的操作?我有一些支票可以用来警告我:
列表继续。底线是,当您为添加功能而更加努力地保持脚本运行时,该离开Bash了。
让我们假设您已决定将工作移至Python。如果您的Bash脚本是干净的,则初始转换非常简单。甚至还有几个转换器/翻译器将为您做第一遍。
下一个问题是:您放弃转向Python的什么?
所有对外部实用程序的调用必须包装在subprocess
模块(或等效模块)中。有多种方法可以做到这一点,直到3.7,它才花了点力气才把它弄对了(3.7改进了subprocess.run()
来自行处理所有常见情况)。
令人惊讶的是,Python没有用于轮询键盘(stdin)的标准独立于平台的非阻塞实用程序(带有超时)。 Bash read
命令是一个非常棒的工具,用于简单的用户交互。我最常见的用法是显示一个微调框,直到用户按下某个键为止,同时还要运行轮询功能(每个微调框步骤),以确保一切运行正常。这是一个比刚开始时要棘手的问题,所以我经常简单地打电话给Bash:昂贵,但这恰好满足了我的需要。
如果您是在嵌入式或受内存限制的系统上进行开发,则Python的内存占用量可能是Bash的很多倍(取决于手头的任务)。另外,内存中几乎总是有一个Bash实例,而Python可能并非如此。
对于一次运行并快速退出的脚本,Python的启动时间可能比Bash的启动时间长得多。但是,如果脚本中包含大量计算,Python会迅速前进。
Python拥有地球上最全面的软件包系统。当Bash变得稍微复杂时,Python可能会提供一个程序包,使整个Bash块成为单个调用。但是,找到合适的软件包成为Pythonista的最大也是最艰巨的任务。幸运的是,Google和StackExchange是您的朋友。
答案 10 :(得分:0)
在性能方面,两者可以做同样的事情,所以问题就在于节省了更多的开发时间?
Bash依赖于调用其他命令,并通过管道传递它们来创建新命令。这样的好处是,无论他们使用哪种编程语言,都可以使用从其他人那里借来的代码快速创建新程序。
这也具有很好的抵抗子命令更改的副作用,因为它们之间的界面只是纯文本。
此外,Bash在如何编写上非常宽容。这意味着它可以在更广泛的上下文中很好地工作,但是它也依赖于程序员以一种干净安全的方式进行编码的意图。否则,Bash不会阻止您制造混乱。
Python的样式更加结构化,因此凌乱的程序员不会那么凌乱。它也可以在Linux以外的操作系统上运行,如果需要这种可移植性,使其立即变得更合适。
但是调用其他命令并不那么简单。因此,如果您的操作系统是Unix,那么您会发现在Bash上进行开发是最快的开发方法。
何时使用Bash:
何时使用Python: