1

私は希望なしにループが終了するのを待って一日を過ごします!. パフォーマンスに関しては、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 が使用されていることがわかりましたが、正直なところ、私の場合はそれを使用する方法がわかりません。どんな洞察も素晴らしいでしょう

4

3 に答える 3

6

私があなたの意図を誤解していなければ、コードを簡素化できます。これにより、速度も向上するはずです。

from scaly.all import *

Packets = rdpcap("pcapfile")
srcList = [pkt[1].src for pkt in Packets]

このソリューションとあなたのソリューションの違いは、簡単な例で説明できます。ご覧のとおり、2 番目の関数は 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
于 2013-01-22T10:47:11.540 に答える
4

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]
于 2013-01-22T10:47:30.520 に答える