Dop*_*ger 85 python bash performance
显然Python更加用户友好,谷歌快速搜索显示许多结果,因为Python字节编译通常更快.我甚至发现这一点声称你可以看到基于字典的操作有超过2000%的改进.
你对这件事的经历是什么?在哪种任务中,每个人都是明显的赢家?
Doc*_*ger 82
典型的主机流程......
Input Disk/Tape/User (runtime) --> Job Control Language (JCL) --> Output Disk/Tape/Screen/Printer
| ^
v |
`--> COBOL Program --------'
Run Code Online (Sandbox Code Playgroud)
典型的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 |
: :
Run Code Online (Sandbox Code Playgroud)
Linux的炮弹像SH/KSH/bash中/...提供输入/输出/流量控制指定设施很像旧主机作业控制语言......但对类固醇!它们是图灵的完整语言,同时经过优化,可以有效地将数据和控制传递给O/S支持的任何语言编写的其他执行进程.
大多数Linux应用程序,无论编写程序的大部分语言,都依赖于shell脚本,而Bash已成为最常见的.单击桌面上的图标通常会运行一个简短的Bash脚本.该脚本直接或间接地知道所需文件的位置,并设置变量和命令行参数,最后调用程序.这是shell最简单的用法.
我们所知道的Linux,如果没有成千上万的shell脚本来启动系统,响应事件,控制执行优先级以及编译,配置和运行程序,那么Linux就不会是Linux.其中许多都非常庞大和复杂.
Shell提供了一种基础结构,允许我们使用在运行时而不是编译时链接在一起的预构建组件.这些组件本身就是独立的程序,可以单独使用或以其他组合方式使用而无需重新编译.调用它们的语法与Bash内置命令的语法无法区分,实际上有许多内置命令,系统上还有一个独立的可执行文件,通常还有其他选项.
Python和Bash在性能上没有语言差异.它完全取决于每个编码方式以及调用哪些外部工具.
任何众所周知的工具,如awk,sed,grep,bc,dc,tr等,都会以任何一种语言进行操作.Bash然后是没有图形用户界面的任何东西的首选,因为从像Bash那样的工具调用和传递数据比使用Python更容易和更有效.
这取决于哪些程序的Bash shell脚本调用和他们的子任务适宜给他们的整体吞吐量和/或响应是否会更好或更差比同等的Python.更复杂的是,Python,像大多数语言一样,也可以调用其他可执行文件,虽然它更麻烦,因此不常用.
Python是明显赢家的一个领域是用户界面.这使它成为构建本地或客户端 - 服务器应用程序的优秀语言,因为它原生支持GTK图形,并且比Bash更直观.
Bash只懂文字.必须为GUI和从它们传回的数据调用其他工具.一个Python的脚本是一个选项.更快但不太灵活的选项是像YAD,Zenity和GTKDialog这样的二进制文件.
虽然像Bash这样的shell 可以很好地处理像Yad,GtkDialog(GTK +函数的嵌入式XML接口),对话框和xmessage这样的GUI,但Python通常更容易,更有能力.
使用shell脚本构建就像组装具有现成组件的计算机一样,就像桌面PC一样.
使用Python,C++或大多数其他语言构建更像是通过将芯片(库)和其他电子部件焊接到智能手机的方式来构建计算机.
Kev*_*tle 71
通常,bash仅在python不可用的环境中比python更好.:)
说真的,我必须每天处理这两种语言,如果给出选择,将立即通过bash使用python.唉,我被迫在某些"小"平台上使用bash,因为有人(错误地,恕我直言)认为python"太大"不适合.
虽然对于某些选择任务来说,bash可能比python更快,但它的开发速度永远不会那么快,或者很容易维护(至少在你过了10行代码之后).Bash唯一强大的特点是python或ruby或lua等,是它无处不在.
vig*_*cer 24
编写脚本时,性能无关紧要(在大多数情况下).
如果你关心性能'Python vs Bash'是一个错误的问题.
Python:
+更容易编写
+更容易维护
+更容易的代码重用(尝试找到通用的防错方式来包含带有公共代码的文件sh,我敢于你)
+你也可以用它做OOP!
+更容易解析的参数.好吧,不是更容易,确切.它仍然会对我的口味太过冗长,但是python已经argparse内置了设施.
- 丑陋的'subprocess'.尝试链接命令,而不是哭河,你的代码将变得多么丑陋.特别是如果您关心退出代码.
Bash:
正如之前所说的那样,无处不在.
+简单的命令链接.这就是你如何以简单的方式将不同命令粘合在一起.另外Bash(不sh)有一些改进,比如pipefail,因此链接真的很短且富有表现力.
+不要求安装第三方程序.可以马上执行.
- 上帝,它充满了陷阱.IFS,CDPATH ......成千上万.
如果编写一个大于100 LOC的脚本:选择Python
如果需要在脚本中进行路径操作:选择Python(3)
如果需要alias稍微复杂一点:选择Bash/sh
无论如何,人们应该尝试双方来了解他们的能力.
也许答案可以通过打包和IDE支持点进行扩展,但我对这方面并不熟悉.
一如既往,你必须选择炖三明治和巨型冲洗.请记住,就在几年前,Perl是新的希望.它现在在哪里.
Grz*_*ywo 21
性能方面的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
Run Code Online (Sandbox Code Playgroud)
*Python加载的库是:os,os.path,json,time,requests,threading,subprocess
这显示了巨大的差异,但是如果它必须做任何合理的事情,那么bash执行时间会迅速降低,因为它通常必须调用外部进程.
如果你关心性能,请使用bash仅用于:
Jus*_*tin 16
Bash主要是一种批处理/ shell脚本语言,对各种数据类型和控制结构周围的各种怪癖的支持要少得多 - 更不用说兼容性问题了.
哪个更快?也不是,因为你不是在这里比较苹果和苹果.如果您必须对ascii文本文件进行排序,并且您使用的是zcat,sort,uniq和sed等工具,那么您将明智地使用Python性能.
但是,如果您需要一个支持浮点和各种控制流的适当编程环境,那么Python将获胜.如果您在Bash和Python中写过一个递归算法,那么Python版本将获得一个数量级或更多.
小智 12
如果你想用最小的努力拼凑一个快速实用程序,bash是好的.对于应用程序的包装器,bash是非常宝贵的.
任何可能让你一遍又一遍地回来添加改进的东西可能(但并不总是)更适合像Python这样的语言,因为包含超过1000行的Bash代码很难维护.当Bash代码变长时,它对调试也很烦人.......
根据我的经验,这些问题的部分问题是shell脚本通常都是自定义任务.我已经遇到的shell脚本编写任务非常少,而且已经有了免费提供的解决方案.
我发布这个迟到的答案主要是因为谷歌喜欢这个问题。
我认为问题和上下文确实应该与工作流程有关,而不是与工具有关。总体理念始终是“为工作使用正确的工具”。但在此之前,许多人在迷失在工具中时往往会忘记:“完成工作。”
当我遇到一个没有完全定义的问题时,我几乎总是从 Bash 开始。我已经解决了一些可读和可维护的大型 Bash 脚本中的棘手问题。
但是什么时候问题开始超过 Bash 应该做的事情呢?我有一些检查我用来给我警告:
名单还在继续。最重要的是,当您更加努力地保持脚本运行并添加功能时,是时候离开 Bash 了。
假设您已决定将工作转移到 Python。如果您的 Bash 脚本是干净的,则初始转换非常简单。甚至有几个转换器/翻译器将为您完成第一遍。
下一个问题是:你放弃转向 Python 是为了什么?
所有对外部实用程序的调用都必须包含在subprocess模块(或等效项)中的某些内容中。有多种方法可以做到这一点,在 3.7 之前,需要付出一些努力才能做到这一点(3.7 改进subprocess.run()了自己处理所有常见情况)。
令人惊讶的是,Python 没有用于轮询键盘 (stdin) 的标准的独立于平台的非阻塞实用程序(带超时)。Bashread命令是用于简单用户交互的绝佳工具。我最常见的用途是在用户按下一个键之前显示一个微调器,同时还运行一个轮询功能(每个微调器步骤)以确保事情仍然运行良好。这是一个比起初看起来更难的问题,所以我经常简单地调用 Bash:昂贵,但它恰好满足了我的需求。
如果您在嵌入式或内存受限的系统上进行开发,Python 的内存占用可能比 Bash 大很多倍(取决于手头的任务)。此外,内存中几乎总是有一个 Bash 实例,而 Python 可能并非如此。
对于运行一次退出很快的脚本,Python 的启动时间可能比 Bash 的要长很多。但是如果脚本包含重要的计算,Python 会迅速领先。
Python 拥有地球上最全面的包系统。当 Bash 变得稍微复杂时,Python 可能有一个包,可以将整个 Bash 块变成单个调用。然而,找到合适的包来使用是成为 Pythonista 最大和最艰巨的部分。幸运的是,Google 和 StackExchange 是您的朋友。
有两个场景,Bash性能至少相等,我相信:
也就是说,我通常并不关心脚本语言本身的性能.如果性能是一个真正的问题,你不是脚本而是程序(可能在Python中).