一个小程序的Python和Bash版本比较

Linux大全评论674 views阅读模式

最近有一个小需求:在一个目录下有很多文件,每个文件的第一行是BEGIN开头的,最后一行是END开头的,中间每一行有多列,数量不等,第一列称为"DN", 第二列称为"CV",DN和CV的联合作为主键,现在需要检测文件中是否有重复的DN-CV。

于是写了个简单的Python程序

#! /usr/bin/python
import 
os
import 
sys
cmd 
= 
"cat /home/zhangj/hosts/* | grep -v BEGIN | grep -v END"
def 
check_dc_line():
 
has_duplicate 
= 
False
 
dc_set 
= 
set
()
 
for 
dc_line 
in 
os.popen(cmd, 
'r'
).readlines():
 
dc_token 
= 
dc_line.split()
 
dn 
= 
dc_token[
0
]
 
cv 
= 
dc_token[
1
]
 
dc 
= 
dn 
+ 
"," 
+ 
cv
 
if 
dc 
in 
dc_set:
   
print 
"duplicate dc found:"
, dc
   
has_duplicate 
= 
True
 
else
:
   
dc_set.add(dc)
 
return 
has_duplicate
if 
not 
check_dc_line():
   
print 
"no duplicate dc"

对于250个文件,共60万行的数据,过滤一遍约1.67秒

有点不甘心这个效率,于是又写了一个同样功能的shell脚本

#! /bin/bash
cat 
/home/zhangj/hosts/
* | 
grep 
-
v 
BEGIN | 
grep 
-
v 
END | 
awk 
'
 
BEGIN {
 
has_duplicate = 0
 
}
 
{
 
dc 
= $1
","
$2; 
 
if 
(
dc 
in 
dc_set) 
 
{
   
print 
"duplicate dc found"

dc 
   
has_duplicate = 1
 

 
else 
{
   
dc_set[
dc
] = 1
 
}
 
}
 
END {
 
if 
(has_duplicate ==0)
 
{
   
print 
"no duplicate dc found"
 
}
 
}
'

为了进一步比较,重复了10次实验。

  use python (second) use bash (second)
  1.74 1.548
  1.698 1.423
  1.674 1.408
  1.718 1.286
  1.757 1.292
  1.600 1.285
  1.647 1.335
  1.661 1.316
  1.654 1.288
  1.647 1.288
average 1.670 1.347

可读性上看,python更简洁优雅一些。不过执行效率略有出乎意料。shell貌似更快一些……

《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm

《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码] http://www.linuxidc.com/Linux/2013-11/92693.htm

Python脚本获取Linux系统信息 http://www.linuxidc.com/Linux/2013-08/88531.htm

在Ubuntu下用Python搭建桌面算法交易��究环境 http://www.linuxidc.com/Linux/2013-11/92534.htm

企鹅博客
  • 本文由 发表于 2019年9月13日 18:22:28
  • 转载请务必保留本文链接:https://www.qieseo.com/180304.html

发表评论