【问题标题】:Message buffer representation in python3python3中的消息缓冲区表示
【发布时间】:2019-07-20 11:40:39
【问题描述】:

想象有一个盒子 A。在这个盒子里我们每 1 秒添加一定数量的消息(示例中为 3/秒),消息的信息与存储无关。消息有一个过期“日期”,它对应于已经过去的特定秒数。 如何在 python3 中以紧凑的方式表示?

下面描述了一个示例,我在框 A 中使用消息列表,其中每条消息都由它“活着”的时间表示(这是我想到的表示之一,但努力做得更好):

time = 0:
empty

time = 1: 
[0,0,0]

time = 2: 
[1,1,1,0,0,0]

time = 3:
[2,2,2,1,1,1,0,0,0]
...

消息的过期时间对应于它们离开缓冲区的时刻。例如,如果“活着”的时间超过 5,它们将被删除。

目标是能够通过简单的计算通过多个时间步,并且能够计算最终缓冲区,而无需一次执行 1 步。 (例如,从时间 = 3 到时间 = 9)

我问这个的原因是因为它不会只有 1 个“盒子”,它会是几个盒子,每个盒子都会有一个用于其他盒子的缓冲区。所以它需要尽可能简单。如果需要任何澄清,请在下面发表评论,我很乐意澄清问题。

【问题讨论】:

  • 当前的表示有什么问题?
  • time=3 中删除了在time=2 添加的1 值之一。那是故意的吗?如果有,为什么?
  • @Deepstop 不是,我编辑了,谢谢。
  • @vekerdyb 我还没有完全编程。在我看来,问题是,首先,缓冲区会很大,并且删除/添加到缓冲区会很重。其次,由于我不需要存储有关每条消息的任何信息,因此我认为可以在它们在网络中那么远的时候对它们进行分组。也许就像说时间 = 4 的 5 条消息,时间 = 5 的 10 条消息,......但是“时间”必须很容易改变。例如,以时间为键的字典不起作用,因为每次有变量“时间”更新时我都必须更改所有条目。
  • 对我来说这听起来像是一个过早的优化问题。我建议您开始开发应用程序,如果您确实遇到性能问题,请三思。如果您有具体问题需要解决,我们将能够提供更好的帮助。

标签: python python-3.x data-representation


【解决方案1】:

最终的答案将取决于整体规模、每个盒子中缓冲区数量的可变性、盒子的数量、秒数。具有大量变化的对象表示可能是一个优势,但如果事情相对简单,那么列表列表将是一个好的开始。

如果您每秒存储的值的数量始终为 3,那么您可以保留一个平面列表并仅使用 maxlength * 3 来丢弃过期的值。以下假设值的数量不同。

time = 0:
[]

time = 1: 
[[0,0,0]]

time = 2: 
[[1,1,1],[0,0,0]]

time = 3:
[[2,2,2],[1,1,1],[0,0,0]]

要添加到列表的前面,然后将列表截断到最大长度(如果它更短则不会导致错误)

buffer.insert(0, new_values_list)
del buffer[maxlen:]

最后,如果您在使用时再次需要该列表。

import itertools
flat_buffer = list(itertools.chain.from_iterable(buffer))

如前所述,您可能希望使用对象来保持事物井井有条,例如将 box 变成一个类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多