我尝试比较同一 Dask 代码在我的 2 台计算机上的 2 次执行。
第一台计算机配备 Intel I5 6500 4 线程/16GB RAM,另一台计算机配备 Intel I7 8750H 12 线程和/16GB RAM 的 MBP。
这是函数:
%%timeit
my_df.map_partitions(
lambda df: df.apply(
lambda x: detect(str(x['Description'])), axis=1)).\
compute(scheduler='processes')
我预计执行时间约为。速度快了 3 倍,但我得到了 10 000 行的结果:
I5 6500
22.9 秒
I7 8750H21.6秒
相同的分区大小和相同的参数。
这怎么可能?
最佳答案
一些注释可以帮助您了解情况。我注意到您没有指定数据的加载方式或 Detect
是什么。
- i7 8750H 有 6 个核心,而不是 12 个。我有 12 个“超线程”,这意味着一个核心可以在线程之间快速交换,但您无法获得一个核心 12 倍的处理能力。 i5 6500有4核。您应该了解 Dask 正在创建多少个工作线程。
- 您
计算
整个结果,这意味着将分区复制回主客户端线程并将它们连接起来。这没有任何相似之处。 - 也许您正在加载客户端中的所有数据,并且必须在开始处理之前将其拆分并复制给工作人员。
- 您应该尝试使用分布式调度程序,您可以在其中指定进程和线程的组合,并通过仪表板获得有关正在发生的情况的更好反馈。有时,这个调度程序也表现得更好,因为它对图表和运行任务的位置有更好的内部组织和优化。
使用分布式调度程序,您可以只对处理部分进行计时
client = distributed.Client(...)
p_df = my_df.persist()
distributed.wait(p_df)
# time this bit
out = p_df.map_partitions(
lambda df: df.apply(
lambda x: detect(str(x['Description'])), axis=1)).persist()
distributed.wait(out)
关于python - 4线程和12线程CPU之间没有明显的提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66528389/