如何在给定的日期时间执行 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
你有两种情况:
myawesomefunc
是IO/bound操作:使用ThreadPoolExecutor
.
myawesomefunc
是CPU/bound操作:使用ProcessPoolExecutor
.
我有一个字典列表。每个项目都包含一个字符串格式的 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
你有两种情况:
myawesomefunc
是IO/bound操作:使用ThreadPoolExecutor
.myawesomefunc
是CPU/bound操作:使用ProcessPoolExecutor
.