1

我正在为Touch Designer中的位置“轨迹”开发一个移动平均过滤器,它实现了 Python 运行时。我是 Python 新手,我不清楚要使用的最佳数据结构。pcode大致是:

  1. 接收格式为:

    id, posX, posY
    2001, 0.54, 0.21
    2002, 0.43, 0.23
    ...

  2. 将传入的 X 和 Y 值添加到以“id”为键的现有数据结构中,如果该 id 已经存在
  3. 为新 ID 创建新条目
  4. 删除传入数据中不存在的任何 id 条目
  5. 返回每个 id 的 X 和 Y 值的移动平均值

问题:将其作为键是 id 并且值是列表的列表的哈希表是一个好主意吗?例如:

ids = {2001: posVals, 2002: posVals2}

posVals[x,y] 对的列表在哪里?

我认为这就像一个 3D 数组,但我想使用 id 作为许多操作的键。

谢谢

4

2 回答 2

1

首先,如果 ID 都是相对较小的正整数,并且数组几乎完全密集(即几乎所有 ID 都会存在),那么 dict 只是增加了额外的开销。另一方面,如果有很大的数字、较大的间隙或不同类型的键,则使用 dict 作为“稀疏数组”是非常有意义的。

同时,对于其他两个维度……您将拥有多少个 ID,每个 ID 有多少对?如果我们谈论的是每个 ID 的少数对和所有 ID 中的数千对,那么每个 ID 的对列表是非常好的(尽管我可能会将每对表示为一个元组而不是一个列表),以及任何否则会增加不必要的复杂性。但是,如果每个 ID 有很多对,或者总数很多,您可能会遇到存储或性能问题。

如果您可以使用第三方库numpy,它可以在比一对数字列表更少的内存中存储一​​个二维数字数组,并且它可以执行诸如移动平均线之类的计算,代码更简洁/更易读,而且更少CPU时间。事实上,它甚至可以为你存储一个稀疏的 3D 数组。

如果您只能使用标准库,则该array模块可以获得大部分相同的内存优势,但没有简单性优势(实际上,您的代码会变得稍微复杂一些,因为您必须将 2D 数组表示为 1D 数组, old-school-C-style——虽然你可以很容易地把它包起来),或者时间性能的好处,它对稀疏性没有帮助。

于 2013-10-24T01:41:21.210 回答
0

是的,我就是这样做的。这种方式非常直观,假设您总是通过它们的 id 查找事物并且不需要以其他方式排序。

此外,Python 中的术语是dict(如字典中的),而不是哈希表。

于 2013-10-24T01:28:29.997 回答