加速python循环处理数据包



我一整天都在等待一个循环毫无希望地退出!我知道python在性能方面不是很有效,因此我非常感谢任何针对我的问题的加速建议。

我使用wireshark捕获了大量的数据包(大约500,000个),并将它们保存到。pcap文件中。之后,我使用Scapy rdpcap()函数从保存的文件中读取数据包,然后在循环中访问每个数据包以提取源IP地址。我的代码如下:

from scaly.all import *
srcList =[]
Packets = rdpcap("pcapfile")
for pkt in Packets:
    src = Packets[Packets.index(pkt)][1].src
    srcList.append(src)

注意:我做了一些挖掘,我发现Cython是用来加速嵌套循环的,但老实说,我不知道如何在我的情况下使用它。如果你有什么见解,那就太好了

如果我没有误解你的意图,你可以简化你的代码,这也应该加快速度:

from scaly.all import *
Packets = rdpcap("pcapfile")
srcList = [pkt[1].src for pkt in Packets]

这个解决方案和你的解决方案的区别可以用一个简单的例子来说明。如您所见,第二个函数要快10倍以上。

In [1]: lst = range(100)
In [2]: def f1(lst):
   ...:     out = []
   ...:     for item in lst:
   ...:         out.append(lst[lst.index(item)])
   ...:     return out
In [3]: def f2(lst):
   ...:     return [item for item in lst]
In [4]: %timeit f1(lst)
1000 loops, best of 3: 221 us per loop
In [5]: %timeit f2(lst)
100000 loops, best of 3: 9.61 us per loop

我怀疑问题在于src = Packets[Packets.index(pkt)][1].src,因为循环是O(n),列表搜索是O(n),使其成为O(n**2)

也许下面也可以:

from scaly.all import *
srcList =[]
Packets = rdpcap("pcapfile")
for pkt in Packets:
    src = pkt[1].src
    srcList.append(src)

from scaly.all import *
Packets = rdpcap("pcapfile")
srcList = [pkt[1].src for pkt in Packets]

如果您只想要IP源,请告诉scapy忽略解析IP层之后的任何内容:

IP.payload_guess = []

把这个放在调用rdpcap之前。Scapy花费大量时间遍历每一层,解析并提取它能找到的所有内容。这是大部分时间用于读取数据包的地方。

另外,考虑将rdpcap更改为PcapReader,这不会加载整个文件。这并不一定会加快速度,但会减少内存占用。

最新更新