有没有办法在IPython笔记本中同时运行多个单元格?

时间:2014-01-21 03:04:28

标签: ipython ipython-notebook

我的笔记本中的一个单元格执行了很长时间,而机器中的其他CPU则处于空闲状态。是否可以并行运行其他单元格?

4 个答案:

答案 0 :(得分:48)

不是神奇的,可能不是你的想法,但是是的。 Here is the documentation for ipyparallel(以前称为IPython parallel)将向您展示如何生成多个IPython内核。在您可以自由地跨核心分发作品之后,您可以使用%%px0 %%px1 ... %%px999(一旦设置)为单元格添加前缀以在特定引擎上执行单元格,实际上对应于单元的并行执行。我也建议你看看Dask

答案 1 :(得分:1)

这不能直接回答您的问题,但我认为这会帮助很多遇到相同问题的人。您可以轻松地在笔记本之间移动变量,然后继续在另一个笔记本上运行功能,然后将结果移回主笔记本。

例如:

笔记本1:

%store X
%store y

笔记本2:

%store -r X
%store -r y

new_df = ...
%store new_df

笔记本1:

%store -r new_df 

答案 2 :(得分:0)

我想介绍一个有这个功能的库,这个不需要多笔记本的技巧等等...

ParslPython 中的高效并行编程

配置

import parsl
from parsl.app.app import python_app, bash_app
parsl.load()

例如,我编辑了 parsl/parsl-tutorial 中的这个片段。

# App that generates a random number after a delay
@python_app
def generate(limit,delay):
    from random import randint
    import time
    time.sleep(delay)
    return randint(1,limit)

# Generate 5 random numbers between 1 and 10
import time
st = time.time()
rand_nums = []
for i in range(5):
    rand_nums.append(generate(10, 1))

# Wait for all apps to finish and collect the results
outputs = [i.result() for i in rand_nums]
et = time.time()
print(f"Execution time: {et - st:.2f}")

# Print results
print(outputs)

结果:

Execution time: 3.00
[1, 6, 4, 8, 3]
<块引用>

请注意,代码执行所需的时间是 3s 不是 5s

所以你可以做的是在一个单元格中调用函数(在这个例子中是generate(...))。此 generate(...) 将返回一个对象。然后,如果您在对象上调用 .result(),它将:

  1. 如果程序正在等待结果,请停止该程序。
  2. 如果完成则返回结果。

因此,只要在最后几个单元格调用.result(),子程序就会在后台运行。并且您可以确定在最后几个单元格中可以获得结果。

关于数据依赖,parsl 非常聪明,它会等待依赖的数据,即使是用 @python_app 修饰的数据。

答案 3 :(得分:-3)

一种可能的解决方法是,您可以打开2个笔记本,然后将一个结果复制到另一个笔记本中。 ?