【问题标题】:How to execute python function at the given datetime如何在给定的日期时间执行python函数
【发布时间】:2020-07-09 05:09:31
【问题描述】:

我有一个字典列表。每个项目都包含一个字符串格式的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+ 个项目,因此在 items 中迭代 throw 每个项目将非常耗时。

那么我该怎么做呢?

【问题讨论】:

    标签: python-3.x list datetime data-structures python-multithreading


    【解决方案1】:

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

    让我们定义一些符号:

    SubTree(N) :返回N的后代节点集的函数,包括N

    Parent(N):返回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/绑定操作:使用 ThreadPoolExecutor
    2. myawesomefunc 是 CPU/绑定操作:使用 ProcessPoolExecutor

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-28
      • 2018-07-28
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多