求助线程进程问题, IPy 处理 IP 网段

2021-09-14 09:31:15 +08:00
 shiyuu

使用 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 来尝试加快执行速度,但是都没有效果 求助大佬,要怎么写才能让执行时间缩短?

1537 次点击
所在节点    Python
8 条回复
RRRoger
2021-09-14 09:46:10 +08:00
先想想能不能优化代码了 你这个循环太多了

另外你这个是 IO 密集型, 开多线程,基于 GIL 不能用多核,把你的 10w IP 切片处理吧
RRRoger
2021-09-14 09:52:21 +08:00
高并发 IO 密集 考虑一下 asyncio
shiyuu
2021-09-14 09:52:29 +08:00
IPy 不能直接做列表对比,不然也不用这么循环一个一个放进去了
Kinnice
2021-09-14 10:44:32 +08:00
代码格式化一下
ch2
2021-09-14 11:19:37 +08:00
学一点数据结构跟计网的知识吧,判断 ip 在网段内很简单的
你把网段做成一个前缀树,这样就不用重复调用 400 次了
调库改成手动判断
另外这个不是 io 密集,就是你写的代码复杂度太高了而已
todd7zhang
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
mansurx
2021-09-14 14:57:05 +08:00
有个办法是把 IP 转换成十进制、然后网段取第一个 ip 和最后一个 ip 转成一个数值范围,这样再判断效率会很高。ipaddress 模块也可以看看
MoYi123
2021-09-14 18:11:59 +08:00
用 pypy,不包含写文件,0.75 秒。
当然你用字典树优化一下肯定能更快。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/801670

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX