使用 IPy 模块做 ip 和网段包含的判断 官方样例 from IPy import IP IP('192.168.1.12') in IP('192.168.1.0/24')
因为 IP 地址和网段很多,所以写了函数
def ipcompare(): ip_list=[] ip_net=[] result=open(r'D:\Python\IP 地址处理\results.txt',"w+") with open(r'D:\Python\IP 地址处理\iplists.txt','r') as lists: for line in lists: ip_list.append(line.rstrip("\n")) with open(r'D:\Python\IP 地址处理\ipnets.txt','r') as nets: for line in nets: ip_net.append(line.rstrip("\n")) for i in ip_list: for n in ip_net: if IP(i) in IP(n): print(f'{n} nets include ipaddress {i}',file=result)
这么写的执行好慢,要 25 分钟才出结果 10 万个 IP 地址,400 个网段,相当于要做 100000*400 次套用 IP('192.168.1.12') in IP('192.168.1.0/24') 来做判断 抄了网上几段 threading 和 multiprocessing 来尝试加快执行速度,但是都没有效果 求助大佬,要怎么写才能让执行时间缩短?
|  |      1RRRoger      2021-09-14 09:46:10 +08:00 先想想能不能优化代码了 你这个循环太多了 另外你这个是 IO 密集型, 开多线程,基于 GIL 不能用多核,把你的 10w IP 切片处理吧 | 
|  |      2RRRoger      2021-09-14 09:52:21 +08:00 高并发 IO 密集  考虑一下 asyncio | 
|  |      3shiyuu OP IPy 不能直接做列表对比,不然也不用这么循环一个一个放进去了 | 
|  |      4Kinnice      2021-09-14 10:44:32 +08:00 代码格式化一下 | 
|  |      5ch2      2021-09-14 11:19:37 +08:00 学一点数据结构跟计网的知识吧,判断 ip 在网段内很简单的   你把网段做成一个前缀树,这样就不用重复调用 400 次了 调库改成手动判断 另外这个不是 io 密集,就是你写的代码复杂度太高了而已 | 
|      6todd7zhang      2021-09-14 11:49:26 +08:00 如果你看下这个的实现 IP('192.168.1.12') in IP('192.168.1.0/24')   就会发现实际上执行和 '192.168.1.12' in ['192.168.1.0', '192.168.1.1', ..., '192.168.1.254', '192.168.1.255'] 没区别 那这个实际执行次数就是 10w * 400 * 255 所以你可以先处理 IP 段 每一行 变成一个 set(str(i) for i in IP('192.168.1.0/24')) 然后再 '192.168.1.12' in set 实测 1000 * 400 : IP('192.168.1.12') in IP('192.168.1.0/24') 3.92s 1000* 400: '192.168.1.12' in set 18.1ms | 
|  |      7mansurx      2021-09-14 14:57:05 +08:00 有个办法是把 IP 转换成十进制、然后网段取第一个 ip 和最后一个 ip 转成一个数值范围,这样再判断效率会很高。ipaddress 模块也可以看看 | 
|  |      8MoYi123      2021-09-14 18:11:59 +08:00 用 pypy,不包含写文件,0.75 秒。 当然你用字典树优化一下肯定能更快。 |