提升Python os.system调用Shell的执行效率

这篇具有很好参考价值的文章主要介绍了提升Python os.system调用Shell的执行效率。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

 

最近做了一个SDN流表的实验,在这个实验中,需要批量删除大量的流表项,使用了shell脚本。然而,我的流表数据存放在python字典中,我一开始是考虑每次读取一个字典并构造一条指令调用os.system(),然后发现这种方法效率非常糟糕。

我考虑问题可能出现在os.system()的调用上,可能它是一种非常费时间的调用(相比于直接用shell处理数据)。

但是麻烦的是,这个SDN项目控制器基于python,我没法直接用shell写控制器程序。

所以然后想了一些办法提升它的执行效率,即本文内容。

本文适用于有大量python数据需要shell进一步处理的环境。

 

实验和方法

 

我写了两个程序,用来测试每次循环调用os.system的执行时间以及直接使用shell的执行时间,如下所示。

Python:

import os
import time

start1=time.clock()
os.system('./shell_test.sh')
end1=time.clock()

start2=time.clock()
for i in range(0,1001):
	command = 'echo ' + str(i)
	os.system(command)
end2=time.clock()

start3=time.clock()
for i in range(0,1001):
	command = 'echo ' + str(i) + ' &'
	os.system(command)
end3=time.clock()

print 'For Cycle in Shell: ' + str(end1-start1) + 's'
print 'For Cycle in Python Command: ' + str(end2-start2) + 's'
print 'For Cycle in Python Command with &: ' + str(end3-start3) + 's'

Shell:

#! /bin/bash

i=0

start=$(date +%s%N)
start_ms=${start:0:16}

while [ $i -le 1000 ]
do
	echo "$i"
	let i=i+1
done

end=$(date +%s%N)
end_ms=${end:0:16}
echo "cost time is: "
echo "scale=6; ($end_ms - $start_ms)/1000000" | bc

 

总结一下:

我考虑了循环1000次并打印的场景,其中,python程序里我统计了三个时间,分别是:

1、调用一次shell,shell循环1000次;

2、python生成shell指令,调用1000次os.system()执行;

3、python生成shell执行,调用1000次os.system(),同时这些os.system()并行执行(最后有一个&)。

 

执行结果:

For Cycle in Shell: 0.000317s(cost time is: .018886)
For Cycle in Python Command: 0.167936s
For Cycle in Python Command with &: 0.171174s

 

结论

 

我们发现,shell中执行1000次循环,其程序的本身运行时间仅需要0.018秒;

然而,如果使用python生成每一条指令并执行os.system(),其时间需要0.16秒,大约相差10倍。

如果仅考虑python中调用os.system()的时间,那么仅调用一次os.system()的时间是循环生成指令并调用的约600分之一(0.0003 VS 0.1679)

在本实验中,我们使用了os.system()的阻塞方法,若使用命令行末尾的 & 或者其他非阻塞方法,此时在理论上,我们仅需考虑python调用的时间。因此,在理想的理论情况上来看,在shell中直接执行循环的效率能够比在python中每次生成命令并调用os.system()的效率提升10到数百倍。

而利用 & 标识进行并行处理的情况和非并行的情况差不多(0.167 VS 0.171),其原因分析是:在这两种情况下,都调用了1000次os.system(),而这可能是一种费时的方法,与简单的执行指令的时间开销并不在一个数量级上。

 

综上所述,若python需要循环调用shell,考虑到程序运行的效率,最关键的问题在于减少os.system类指令的调用次数。

解决的思路是:将循环写入shell脚本,减少python调用shell的次数。如果shell脚本需要额外python程序中生成的参数作为输入,将其作为环境变量,传给shell脚本。

 

如何实现python将数组传入shell,并在shell中循环执行请参考我的另一篇博客:

https://blog.csdn.net/yyd19981117/article/details/117337487?spm=1001.2014.3001.5501文章来源地址https://www.toymoban.com/news/detail-420722.html

到了这里,关于提升Python os.system调用Shell的执行效率的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python中os.system()、subprocess.run()、call()、check_output()的用法

    os.system() 是对 C 语言中 system() 系统函数的封装,允许执行一条命令,并返回退出码(exit code),命令输出的内容会直接打印到屏幕上,无法直接获取。 示例: Python 3.5 开始推荐使用这个方法执行命令,其原型如下: 其中: args: 可以是一个字符串(当 shell=True 时),也可以

    2024年02月12日
    浏览(29)
  • Android System Property讲解前言

    我们在开发过程中经常会使用到系统属性,例如获取系统软件版本,获取设备名名称,boardid等;有时也需要内置自己的属性,系统属性简单来说是用来存储系统中某些键值对数据,具有全局性、存取灵活方便的特点。 setprop 可以给属性设置int,bool,string等基本类型 在java代码中

    2024年02月07日
    浏览(34)
  • 13.108.Spark 优化、Spark优化与hive的区别、SparkSQL启动参数调优、四川任务优化实践:执行效率提升50%以上

    13.108.Spark 优化 1.1.25.Spark优化与hive的区别 1.1.26.SparkSQL启动参数调优 1.1.27.四川任务优化实践:执行效率提升50%以上 1.1.25.Spark优化与hive的区别 先理解spark与mapreduce的本质区别,算子之间(map和reduce之间多了依赖关系判断,即宽依赖和窄依赖。) 优化的思路和hive基本一致,比较

    2024年02月10日
    浏览(34)
  • 运维Shell脚本小试牛刀(七):在函数文脚本件中调用另外一个脚本文件中函数|函数递归调用|函数后台执行

    运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0); pwd)命令详解 运维Shell脚本小试牛刀(四): 多层嵌套if...elif...elif....else fi_蜗牛杨哥的博客-CSDN博客 Cenos7安装小火车程序动画 运维Shell脚本小试牛刀(五):until循环 运维Shell脚本小试牛刀

    2024年02月09日
    浏览(41)
  • Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令

    目录 ProcessBuilder类的介绍及使用 【前言】 【正文】 --构造方法-- --常用方法-- --使用技巧-- --调用本地Shell命令,实例-- 【总结】 【注意】         在做一个项目的时候需要用到运行时动态执行JAVA命令,一开始的思路是运行时生成bat脚本,然后通过Runtime类的exec方法之行

    2024年02月09日
    浏览(35)
  • Python自动化办公:提升效率,释放潜力(借助AI实现)

    欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。搜索关注公粽号《机器和智能》即可领取技术大礼包

    2024年02月15日
    浏览(33)
  • Python中使用隧道爬虫ip提升数据爬取效率

    作为专业爬虫程序员,我们经常面临需要爬取大量数据的任务。然而,有些网站可能会对频繁的请求进行限制,这就需要我们使用隧道爬虫ip来绕过这些限制,提高数据爬取效率。本文将分享如何在Python中使用隧道爬虫ip实现API请求与响应的技巧。并进行详细的解析和实际代码

    2024年02月12日
    浏览(29)
  • < Python全景系列-7 > 提升Python编程效率:模块与包全面解读

    欢迎来到我们的系列博客《Python全景系列》!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法。无论你是编程新手,还是有一定基础的开发者,这个系列都将提供你需要的知识和技能。 Python全景系列的第七

    2024年02月06日
    浏览(29)
  • Python调用Shell命令 (python,shell 混合编程)

    Python经常被称作“胶水语言”,因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库,也当然可以用Python调用Shell命令。 用Python调用Shell命令有如下几种方式: os .system( \\\"The command you want\\\" ). os .system( \\\"lscpu\\\" ). os .system( \\\"ls -al\\\" ). 这个调用相当直接,且是同步进行的

    2024年02月16日
    浏览(35)
  • Python调用adb shell

    在Android开发中,ADB(Android Debug Bridge)是一个非常重要的工具。它可以让我们通过命令行或者其他的客户端与安装了ADB驱动的Android设备进行通信,并进行一些调试操作。 Python作为一门灵活强大的语言,很自然就成为了用来控制ADB的工具之一。本文将介绍如何使用Python调用A

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包