0

我正在使用 urllib2 和 ElementTree 来监视 XML 文件中的新条目,并使用Pushover来在每次检测到新条目时发送推送通知。条目在 XML 文件中的存在时间从 30 分钟到 4 小时不等。该脚本每 5 分钟运行一次。使脚本仅在的条目上提醒我而不是每 5 分钟提醒我一次相同条目的最佳方法是什么?

4

1 回答 1

0

条目是否与时间戳相关联,以便每次更新文件时新条目的时间戳总是晚于旧条目?如果是这样,只需保留您推送的最后一个条目的时间戳,并在解析 XML 文件时,推送更新的内容并丢弃旧的内容。

如果没有,Python 有相当不错的集合操作算法,所以我会试试这个:保留一个set已经推送的条目。

already_pushed = set()

每次您的脚本运行时,请执行以下操作:

  1. 从文件中创建另一个set条目

    from_file = parse_file()
    
  2. “减去”(设置差异)已推送条目的集合

    new_entries = from_file - already_pushed
    
  3. 推送新条目

    push_all(new_entries)
    
  4. 通过原始设置并修剪任何超过 4 小时 + 5 分钟的内容

    cutoff = datetime.now() - timedelta(hours=4, minutes=5) # I forget the syntax
    already_pushed = set(e for e in already_pushed if e.timestamp > cutoff)
    
  5. 添加新推送的条目

    already_pushed += new_entries
    

由于您仅每五分钟运行一次,除非文件中有大量的条目,否则它应该足够快。

如果效率是一个问题,您可能可以通过保留已推送的条目的排序(按时间戳)列表,将文件解析为类似排序的条目列表,并运行处理来自一个列表的条目的合并算法来制定更好的算法或其他,酌情推动并保留或丢弃它。但是,使用更好的算法所获得的效率收益可能会超过在 Python 中实现整个事物所带来的效率损失。在这种情况下,您可能必须使用 C 或 C++ 才能真正获得更好的性能。

于 2013-06-08T05:16:36.807 回答