如何在给定的日期时间执行 python 函数

How to execute python function at the given datetime

我有一个字典列表。每个项目都包含一个字符串格式的 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

现在我想为满足以下条件的每个 item 调用 myawesomefunc

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

我无法排序 items 因为它会不断变化。由于列表可能包含 30k+ 项,因此迭代 throw items 中的每个项将非常耗时。

那我该怎么做呢?

我建议使用某种数据结构来提高搜索和插入的效率,例如 Binary Search Tree (BST).

让我们定义一些符号:

SubTree(N) : 函数return N 的后代节点集合包括 N.

Parent(N) : return N.

父级的函数

X.left, X.right:节点的左右子节点X.

如果是 BST,您的搜索关键字将是每个项目的 timestamp。您将以相等的间隔搜索键小于或等于 datetime.now() 的节点 X,并且您将对集合 S 中的每个节点执行 myawesomefunc:

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是IO/bound操作:使用ThreadPoolExecutor.
  2. myawesomefunc是CPU/bound操作:使用ProcessPoolExecutor.