2017-03-08 30 views
0

我已經在下面創建腳本處理基於用戶輸入的兩個文件並生成第三個結果文件。基於python文件的程序需要時間來執行

腳本正常執行沒有任何問題,但是當兩個文件都有很高的數量,那麼它需要時間。在測試過程中,我測試了InputFile-1有500000條記錄,InputFile-2有100條記錄。

所以想檢查是否有任何優化的可能性減少總體執行時間。請分享您的想法。

在此先感謝。

import ipaddress 
filePathName1 = raw_input('InputFile-1 : ') 
filePathName2 = raw_input('InputFile-2: ') 

ipLookupResultFileName = filePathName1 + ' - ResultFile.txt' 
ipLookupResultFile = open(ipLookupResultFileName,'w+') 

with open(filePathName1,'r') as ipFile: 
    with open(filePathName2,'r') as ipCidrRangeFile: 
     for everyIP in ipFile: 
      ipLookupFlag = 'NONE' 
      ipCidrRangeFile.seek(0) 
      for everyIpCidrRange in ipCidrRangeFile: 
       if (ipaddress.IPv4Address(unicode(everyIP.rstrip('\n'))) in ipaddress.ip_network(unicode(everyIpCidrRange.rstrip('\n')))) == True: 
        ipLookupFlag = 'True' 
        break 
      if ipLookupFlag == 'True': 
       ipLookupResultFile.write(everyIP.rstrip('\n') + ' - Valid_Operator_IP' + '\n') 
      else: 
       ipLookupResultFile.write(everyIP.rstrip('\n') + ' - Not_Valid_Operator_IP' + '\n') 

ipFile.close() 
ipCidrRangeFile.close() 
ipLookupResultFile.close() 

記錄樣本爲INPUTFILE-1: 192.169.0.1 192.169.0.6 192.169.0.7

記錄樣本爲INPUTFILE-2:ResultFile.txt

192.169.0.1/32 
192.169.0.6/16 
255.255.255.0/32 
255.255.255.0/16 
192.169.0.7/32 

記錄樣本:

192.169.0.1 - Not_Valid_Operator_IP 
192.169.0.6 - Valid_Operator_IP 
192.169.0.7 - Not_Valid_Operator_IP 
+0

退房http://stackoverflow.com/questions/582336/how-can-you-profile-a-script/582337#582337 –

+0

你可以編輯問題給小樣本文件,並預期'ResultFile。 txt'輸出? –

+0

@MartinEvans - 編輯的文件記錄有問題...... – AJNEO999

回答

0

更好的方法是加載和一次處理每個文件,然後用這個數據做處理:

filePathName1 = raw_input('InputFile-1 : ') 
filePathName2 = raw_input('InputFile-2: ') 

ipLookupResultFileName = filePathName1 + ' - ResultFile2.txt' 

with open(filePathName1) as ipFile: 
    ip_addresses = [unicode(ip.strip()) for ip in ipFile] 

with open(filePathName2) as ipCidrRangeFile: 
    ip_cidr_ranges = [unicode(cidr.strip()) for cidr in ipCidrRangeFile] 

with open(ipLookupResultFileName,'w+') as ipLookupResultFile: 
    for ip_address in ip_addresses: 
     ipLookupFlag = False 
     for cidr_range in ip_cidr_ranges: 
      if ipaddress.IPv4Address(ip_address) in ipaddress.ip_network(cidr_range): 
       ipLookupFlag = True 
       break 

     if ipLookupFlag: 
      ipLookupResultFile.write("{} - Valid_Operator_IP\n".format(ip_address)) 
     else: 
      ipLookupResultFile.write("{} - Not_Valid_Operator_IP\n".format(ip_address)) 

注意,使用with()意味着你不需要明確地關閉文件之後。

根據您的需要,可以通過刪除任何重複ip_addresses進一步提高速度。這可以通過將數據裝入一個set()而不是一個列表,例如做:

ip_addresses = set(unicode(ip.strip()) for ip in ipFile) 

您也可以將它們寫入到文件之前,你的結果通過IP地址進行排序。

+0

感謝您的回覆!如果我使用set(),那麼腳本執行時間是7分鐘,但它會刪除所有不需要的重複記錄...所以,我選擇了上面的解決方案,因爲它找到了7秒的改進。 – AJNEO999

0

重點在於,對於ipFile中的每一行,你重新讀取ipCidrRangeFile。而是將ipCidrRangeFile讀入列表或其他集合中,然後從循環中讀取。

with open(filePathName2,'r') as ipCidrRangeFile: 
    ipCidrRangeList = ipCidrRangeFile.readlines() 

with open(filePathName1,'r') as ipFile: 
    with open(filePathName2,'r') as ipCidrRangeFile: 
     for everyIP in ipCidrRangeList : 
      ipLookupFlag = 'NONE' 
      ipCidrRangeFile.seek(0) 
      for everyIpCidrRange in ipCidrRangeFile: 
       if (ipaddress.IPv4Address(unicode(everyIP.rstrip('\n'))) in ipaddress.ip_network(unicode(everyIpCidrRange.rstrip('\n')))) == True: 
        ipLookupFlag = 'True' 
        break 
      if ipLookupFlag == 'True': 
       ipLookupResultFile.write(everyIP.rstrip('\n') + ' - Valid_Operator_IP' + '\n') 
      else: 
       ipLookupResultFile.write(everyIP.rstrip('\n') + ' - Not_Valid_Operator_IP' + '\n') 
+0

感謝@Heroworkshop,實施了你的建議和執行時間提高了6分鐘。 – AJNEO999

相關問題