Я выполняю приведенный ниже код, чтобы читать строку за строкой из 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](https://i.stack.imgur.com/u0fw8.png)
Почему проверка ключа и вставка новой пары ключ: список занимает так много времени?
Может кто-нибудь предложить совет, как ускорить этот код или улучшить структуру данных для достижения этого?
Ниже приведен пример пары ключ: значение. Я ожидаю, что около 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]]