簡體   English   中英

基於python文件的程序花時間執行

[英]python file based program taking time to execute

我在下面的腳本中創建了基於用戶輸入的兩個文件,並生成了第三個結果文件。

腳本可以正確執行,沒有任何問題,但是當兩個文件的計數都很高時,則需要花費一些時間。 在測試過程中,我測試了具有500000條記錄的InputFile-1和具有100條記錄的InputFile-2。

因此想檢查是否有可能進行優化以減少總體執行時間。 請分享您的想法!

提前致謝。

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的樣本記錄:

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

ResultFile.txt的示例記錄:

192.169.0.1 - Not_Valid_Operator_IP
192.169.0.6 - Valid_Operator_IP
192.169.0.7 - Not_Valid_Operator_IP

首先要關注的是,對於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')

更好的方法是一次加載和處理每個文件,然后使用此數據進行處理:

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地址對結果進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM