基于python文件的程序花时间执行

时间:2017-03-08 09:04:27

标签: python python-2.7 optimization file-processing

我创建了以下脚本根据用户输入处理两个文件并生成第三个结果文件。

脚本执行正常,没有任何问题,但是当两个文件都有高计数时,则需要时间。在我测试期间,我测试了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的示例记录:

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

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分: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地址对结果进行排序。