【发布时间】:2019-05-05 17:17:58
【问题描述】:
我正在尝试遍历两个循环,第一个 segment_arr 是一条线的小段(例如 0.1m)列表(按沿线的距离排序),第二个 fail_sections 是一个列表该线的较大部分(例如5m)以某种方式“失败”(也按沿线的距离排序)。最终我试图合并浮点范围 - 有一些答案here,但都是基于整数和一些关于重叠的警告。
我有一个非常幼稚的版本,它的性能似乎足以满足我的目的,但它让我思考,如何才能提高效率:
new_seg_array = []
for seg in segment_arr:
segfail = False
for fail_sec in fail_sections:
if seg.start_dist >= fail_sec.start_dist and seg.end_dist <= fail_sec.end_dist:
segfail = True
seg_data = Segment(start_dist=seg.start_dist,end_dist=seg.end_dist, does_fail=segfail)
new_seg_array.append(seg_data)
主要问题是第二个循环浪费了迭代,因为第二个范围远远超出了我们在第一个范围内的位置,所以条件不可能为真。我考虑过使用生成器表达式,例如
filtered_fail_sections = (x for x in fail_sections where x.start_distance > seg.start_distance and x.end_distance < seg.end_distance)
for fail_sec in filtered_fail_sections:
过滤相关的失败段,但令我震惊的是,这只是在生成器中进行过滤工作。 Python中有没有办法逐渐减少第二个循环的范围,所以不再相关的元素因为它们超出了第一个循环的范围而不再迭代?所以随着时间的推移,第二个循环会变得更小,直到它什么都没有,这可能有助于在更大数据集上的性能。或者任何其他可能的重大效率改进?
【问题讨论】:
标签: python performance loops