2011-11-16 74 views
1

下面是我的Python文件搜索應用程序的基本功能。我仍然是Python的noob,並且對於獲取工作代碼比考慮效率和性能更感興趣。我想從你那裏得知Python或任何其他語言,退伍軍人是否有任何事情可以使我的代碼更高效,從而更快?我已經閱讀過關於分析腳本的地方,但我並不十分熟悉這個概念,也不確定它是否適用。目前,我的代碼需要大約4-5分鐘來搜索100個文件(最大的文件是〜5000KB)。這很慢。我的Python搜索代碼的效率如何?

代碼:

userstring = raw_input("Enter a search string!") 
... 
... 
... 
if userstring: 
     userStrHEX = userstring.encode('hex') 
     userStrASCII = ''.join(str(ord(char)) for char in userstring) 
     regex = re.compile(r"(%s|%s|%s)" % (re.escape(userstring), re.escape(userStrHEX), re.escape(userStrASCII)))  
else: 
    sys.exit('You Must Enter A String!!!') 

    count = 0 
    count2 = 0 
    for afile in filelist: 
     (head, filename) = os.path.split(afile) 
     if afile.endswith(".log") or afile.endswith(".txt"): 
      count2 += 1 
      self.progress_bar.Show() 
      self.progress_bar.SetRange(numFiles) 
      wx.CallAfter(self.progress_bar.SetValue, count2) 
      f=ftp.open(afile, 'r') 
      for i, line in enumerate(f.readlines()): 
       result = regex.search(line) 
       if self.shouldAbort: 
        return self.shouldAbort 
        break 

       if result: 
        count += 1 
        ln = str(i) 
        pathname = os.path.join(afile) 
        template = "\n\nLine: {0}\nFile: {1}\nString Type: {2}\n\n" 
        output = template.format(ln, pathname, result.group()) 
        ftp.get(afile, 'c:\\Extracted\\' + filename) 
        temp.write(output) 
        break 
      else: 
       temp.write("\nNo Match in: " + os.path.join(afile)) 

回答

1

這是一個非常合理的解決方案。

使用更多正則表達式可以讓它變得更快,但是會失去一些清晰度。

請記住,運行時間可能由FTP文件檢索控制,而不是搜索本身。因此,IO bound進程的額外優化可能會被浪費。請參閱Amdahl's Law