在循环中恢复循环的 pythonic 方法是什么
What is the pythonic way to to resume a loop within a loop
我有一个 python 2.7 应用程序,我偶尔会中断。
我正在处理一个非常大的数据文件。为了处理内存限制,我将数据文件分成由 x 和 y 组件标识的网格。每个网格都是独立处理的。
处理时间很长所以偶尔需要在某个点停止处理。理想情况下,我想更新 y_start 和 x_start 并在我离开的地方恢复应用程序(不处理已经处理过的网格)。
主要操作发生在嵌套的 for 循环中:
x_start=0.0
x_step=0.05
x_size=10.0
y_start=0.0
y_step=0.05
y_size=10.0
x_ranges = zip(np.arange(x_start,x_size,x_step), np.arange(x_step+x_start,x_size+x_step,x_step))
y_ranges = zip(np.arange(0.0,y_size,y_step), np.arange(y_step,y_size+y_step,y_step))
for x_min,x_max in x_ranges:
for y_min,y_max in y_ranges:
doAction()
在上面的代码中,我处理了 x_start。 y_start 只应在 x_min = x_start 时使用。对于 x 的所有其他值,它应该从 0.0 开始。
这是我提出的解决方案。有没有更好更pythonic的方式:
y_ranges_resume = zip(np.arange(y_start,y_size,y_step),np.arange(y_start+y_step,y_size+y_step,y_step)
for x_min,x_max in x_ranges:
if x_min == x_start:
for y_min,y_max in y_ranges_resume:
doAction()
else:
for y_min,y_max in y_ranges:
doAction()
我不确定更像 pythonic 的方式,但你可以像这样重写它(实际上用任何语言):
y_ranges_resume = zip(np.arange(y_start,y_size,y_step),np.arange(y_start+y_step,y_size+y_step,y_step)
for x_min,x_max in x_ranges:
y_ranges_used = y_ranges
if x_min == x_start:
y_ranges_used = y_ranges_resume
for y_min,y_max in y_ranges_used:
doAction()
至少内循环只写一次
或者你可以使用三元,但我的错误是更容易阅读而不是更小的代码。但为了完整起见,你可以这样写同样的东西:
y_ranges_resume = zip(np.arange(y_start,y_size,y_step),np.arange(y_start+y_step,y_size+y_step,y_step)
for x_min,x_max in x_ranges:
for y_min, y_max in y_ranges_resume if x_min == x_start else y_ranges:
doAction()
您可以尝试列表理解:
[[doAction() for y_min,y_max in y_ranges_resume] if x_min == x_start else [doAction() for y_min,y_max in y_ranges] for x_min,xmax in x_ranges]
或者您可以使用 lambda 函数来简化条件
correct_y_range = lambda x : y_ranges_resume if x == x_start else y_ranges
[[doAction() for y_min,y_max in correct_y_range(x_min)] for x_min,x_max in x_ranges]
lambda 函数的另一个选项(为了更好的可读性)
correct_y_range = lambda x : y_ranges_resume if x == x_start else y_ranges
for x_min,x_max in x_ranges:
for y_min, y_max in correct_y_range(x_min):
doAction()
我有一个 python 2.7 应用程序,我偶尔会中断。
我正在处理一个非常大的数据文件。为了处理内存限制,我将数据文件分成由 x 和 y 组件标识的网格。每个网格都是独立处理的。
处理时间很长所以偶尔需要在某个点停止处理。理想情况下,我想更新 y_start 和 x_start 并在我离开的地方恢复应用程序(不处理已经处理过的网格)。
主要操作发生在嵌套的 for 循环中:
x_start=0.0
x_step=0.05
x_size=10.0
y_start=0.0
y_step=0.05
y_size=10.0
x_ranges = zip(np.arange(x_start,x_size,x_step), np.arange(x_step+x_start,x_size+x_step,x_step))
y_ranges = zip(np.arange(0.0,y_size,y_step), np.arange(y_step,y_size+y_step,y_step))
for x_min,x_max in x_ranges:
for y_min,y_max in y_ranges:
doAction()
在上面的代码中,我处理了 x_start。 y_start 只应在 x_min = x_start 时使用。对于 x 的所有其他值,它应该从 0.0 开始。
这是我提出的解决方案。有没有更好更pythonic的方式:
y_ranges_resume = zip(np.arange(y_start,y_size,y_step),np.arange(y_start+y_step,y_size+y_step,y_step)
for x_min,x_max in x_ranges:
if x_min == x_start:
for y_min,y_max in y_ranges_resume:
doAction()
else:
for y_min,y_max in y_ranges:
doAction()
我不确定更像 pythonic 的方式,但你可以像这样重写它(实际上用任何语言):
y_ranges_resume = zip(np.arange(y_start,y_size,y_step),np.arange(y_start+y_step,y_size+y_step,y_step)
for x_min,x_max in x_ranges:
y_ranges_used = y_ranges
if x_min == x_start:
y_ranges_used = y_ranges_resume
for y_min,y_max in y_ranges_used:
doAction()
至少内循环只写一次
或者你可以使用三元,但我的错误是更容易阅读而不是更小的代码。但为了完整起见,你可以这样写同样的东西:
y_ranges_resume = zip(np.arange(y_start,y_size,y_step),np.arange(y_start+y_step,y_size+y_step,y_step)
for x_min,x_max in x_ranges:
for y_min, y_max in y_ranges_resume if x_min == x_start else y_ranges:
doAction()
您可以尝试列表理解:
[[doAction() for y_min,y_max in y_ranges_resume] if x_min == x_start else [doAction() for y_min,y_max in y_ranges] for x_min,xmax in x_ranges]
或者您可以使用 lambda 函数来简化条件
correct_y_range = lambda x : y_ranges_resume if x == x_start else y_ranges
[[doAction() for y_min,y_max in correct_y_range(x_min)] for x_min,x_max in x_ranges]
lambda 函数的另一个选项(为了更好的可读性)
correct_y_range = lambda x : y_ranges_resume if x == x_start else y_ranges
for x_min,x_max in x_ranges:
for y_min, y_max in correct_y_range(x_min):
doAction()