Как выполнить функцию python в указанное datetime - PullRequest
1 голос
/ 09 июля 2020

У меня есть список словарей. Каждый элемент содержит поле datetime в строковом формате:

items = [{"Name":"Fooo","Time":"2 Jun, 7:20PM","Location":"LA"},
{"Name":"Yeam","Time":"27 Jun, 9:20PM","Location":"CA"},
{"Name":"Bar","Time":"12 Aug, 7:50PM","Location":"NY"},
{"Name":"Ahoy","Time":"20 Jul, 3:20AM","Location":"TX"}]

def myawesomefunc(item):
    # Do something awesome
    # and return the result
    pass

Теперь я хочу вызвать myawesomefunc для каждого item, которое удовлетворяет:

datetime.now() >= datetime.strptime(item['Time'], '%d %b, %I:%M%p')

Я не могу отсортировать items, потому что он будет постоянно меняться. Поскольку список может содержать более 30 тыс. Элементов, повторение каждого элемента в items займет очень много времени.

Итак, как мне это сделать?

1 Ответ

1 голос
/ 09 июля 2020

Я предлагаю использовать какую-то структуру данных, которая делает поиск и вставку более эффективными, например Дерево двоичного поиска ( BST ) .

Давайте определим некоторые обозначения:

SubTree(N): функция, возвращающая набор дочерних узлов N, включая N.

Parent(N): Функция, возвращающая родительский элемент N.

X.left, X.right: левый и правый дочерние элементы узла X.

В случае BST , ключом поиска будет timestamp для каждого элемента. Через равные промежутки времени вы будете искать узел X с ключом, меньшим или равным datetime.now(), и вы будете выполнять myawesomefunc для каждого узла в наборе S:

S = {X} ⋃ SubTree(X.left) ⋃ (SubTree(X.right) if X.right <= datetime.now() else {})

Затем вам нужно обновить свое дерево, чтобы исключить все обрабатываемые узлы:

Parent(X).left = None if X.right <= datetime.now() else X.right 

Вставка нового элемента выполняется напрямую (обычная вставка, как и любой BST).

Теперь о выполнении myawesomefunc у вас есть два случая:

  1. myawesomefunc - это операция ввода-вывода / привязки: используйте ThreadPoolExecutor.
  2. myawesomefunc - это операция ЦП / привязка: используйте ProcessPoolExecutor.
...