【发布时间】:2021-02-25 22:01:46
【问题描述】:
我有大约 60000 个数据点的样本,并且在迭代算法中,在每个步骤中,根据某些标准,我要么“删除”(设置为 NaN)其中一个数据点,要么“添加”之前的一个删除的数据点回到样本中(设置回其原始值)。为了避免算法陷入死循环,每次迭代的样本应该总是不同的。因此,我会跟踪当前在每次迭代中删除的数据点,并将元素索引存储在列表中,如下所示:
- 迭代 1:data_state_list = [[2]](删除了数组索引为 2 的元素)
- 迭代 2:data_state_list = [[2],[2,3]](删除数组索引为 3 的元素)
- 迭代 3:data_state_list = [[2],[2,3],[2,3,1]]
- 迭代 4:data_state_list = [[2],[2,3],[2,3,1],[2,1]](重新添加数组索引为 3 的元素)
- 迭代 5:data_state_list = [[2],[2,3],[2,3,1],[2,1],[2,1,4]]李>
- 迭代 6:data_state_list = [[2],[2,3],[2,3,1],[2,1],[2,1,4],[2 ,1,4,3]]
现在在当前迭代 7 中,算法建议删除数组索引为 4 的元素,因此新状态 data_state_temp 将是 [2,1,3]。目前它通过
检查它是否已经看到了迄今为止的状态flag_cycle = (data_state_temp in data_state_list)
算法检查新状态以添加/删除不同的数组元素,直到flag_cycle 为False,然后继续。
除此之外它还没有完全工作,因为迭代 7 中的状态 [2,1,3] 和迭代 3 中的 [2,3,1] 相同,但列表不同(需要排序它们或更好地将新删除的数组元素插入到它们应该属于排序列表的位置),问题是算法变得非常慢。在实践中,例如data_state_temp 的长度为 15000,data_state_list 有 40000 个列表,通常长度会增加到 15000。
问题:
- 我们怎样才能加快循环/无限循环检查的速度?检查我们之前是否已经拥有相同状态的其他/概念上不同的方法非常好。
- 在当前代码中,当 Python 检查
data_state_temp是否在data_state_list中时,它是否只比较长度与data_state_temp匹配的列表元素(我希望如此)还是我们需要手动选择事先列出这些清单?
【问题讨论】: