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


最近有一个小需求:在一个目录下有很多文件,每个文件的第一行是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中文版]

《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码]

Python脚本获取Linux系统信息

在Ubuntu下用Python搭建桌面算法交易研究环境

Python 的详细介绍:请点这里
Python 的下载地址:请点这里

本文永久更新链接地址:

相关内容