Низкая производительность для поиска и вставки в словарь Python - PullRequest
0 голосов
/ 27 января 2020

Я выполняю приведенный ниже код, чтобы читать строку за строкой из Pandas DataFrame и создавать «цепочки» строк под ключами в Словаре.

  flows = dict()

  for row in df.itertuples():
    key = (row.src_ip,row.dst_ip,row.src_port,row.dst_port,row.protocol)

    if key in flows:
      flows[key] += [[row.timestamp, row.length]]
    else:
      flows[key] = [[row.timestamp, row.length]]

Контекст таков, что я поиск списков пакетов, которые являются частью одного и того же потока (5 наборов адресов, каналов и протокола). Я надеюсь обработать 70 миллионов пакетов.

Ниже приведено сравнение моей построчной производительности для 1 000 000 и 2 000 000 строк в DF. Строки if key in flows и flows[key] = [[row.timestamp, row.length]] не масштабируются с n, как я ожидал - я думал, что и вставка, и поиск были в среднем O (1) и O (n) в худшем случае?

enter image description here enter image description here

Почему проверка ключа и вставка новой пары ключ: список занимает так много времени?

Может кто-нибудь предложить совет, как ускорить этот код или улучшить структуру данных для достижения этого?

Ниже приведен пример пары ключ: значение. Я ожидаю, что около 35 миллионов из них будут храниться в словаре.

('74.178.232.151', '163.85.67.184', 443.0, 49601.0, 'UDP'): [[1562475600.3387961, 1392], [1562475600.338807, 1392], [1562475600.3388178, 1392], [1562475600.3388348, 1392], [1562475600.338841, 1392]]
...