我的笔记本中的一个单元格执行了很长时间,而机器中的其他CPU则处于空闲状态。是否可以并行运行其他单元格?
答案 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)
我想介绍一个有这个功能的库,这个不需要多笔记本的技巧等等...
Parsl 是Python 中的高效并行编程
配置
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()
,它将:
因此,只要在最后几个单元格调用.result()
,子程序就会在后台运行。并且您可以确定在最后几个单元格中可以获得结果。
关于数据依赖,parsl 非常聪明,它会等待依赖的数据,即使是用 @python_app
修饰的数据。
答案 3 :(得分:-3)
一种可能的解决方法是,您可以打开2个笔记本,然后将一个结果复制到另一个笔记本中。 ?