Ответ 1
То, что я обычно делаю в этих сценариях, это переносить важные ячейки как функции (вам не нужно объединять их) и иметь определенную главную ячейку, которая выполняет итерацию по списку параметров и вызывает эти функции. Например. это то, что "основная ячейка" выглядит в одном из моих ноутбуков:
import itertools
# parameters
P_peak_all = [100, 200]
idle_ratio_all = [0., 0.3, 0.6]
# iterate through these parameters and call the notebook logic
for P_peak, idle_ratio in itertools.product(P_peak_all, idle_ratio_all):
print(P_peak, idle_ratio, P_peak*idle_ratio)
print('========================')
m_synth, m_synth_ns = build_synth_measurement(P_peak, idle_ratio)
compare_measurements(m_synth, m_synth_ns, "Peak pauser", "No scheduler", file_note="-%d-%d" % (P_peak, int(idle_ratio*100)))
У вас все еще есть перетаскивание данных по всему ноутбуку (т.е. вызов каждой функции в нижней части ячейки с вашими данными), чтобы иметь возможность тестировать материал в реальном времени для отдельных ячеек. Например, какая-то ячейка может указать:
def square(x):
y = x**2
return y
square(x) # where x is your data running from the prior cells
Позволяет вам экспериментировать в прямом эфире и все еще вызывать общие функции из основной ячейки.
Я знаю, что некоторые дополнительные работы по рефакторингу вашего ноутбука с помощью функций, но я нашел, что на самом деле он повышает читаемость ноутбука, что полезно, когда вы возвращаетесь к нему через более длительный период, и проще преобразовать его в "правильный" script или модуль, если необходимо.