python - Python 中的多重处理比没有时慢

标签 python multiprocessing

我在一台 2 核 4 线程的计算机上使用 python 3.3。我正在尝试学习使用多处理来加速代码,但是使用它时我的代码速度变慢。

为了开始我的学习,我制作了一个小程序:

from multiprocessing import Process
import time

def f():
    s = 0
    for i in range(2*10**7):
        s += i
    return s

if __name__ == '__main__':
    t = time.time()
    p1 = Process(target = f)
    p2 = Process(target = f)
    p3 = Process(target = f)
    p4 = Process(target = f)
    p1.start()
    p2.start()
    p3.start()
    p4.start()
    p1.join()
    p2.join()
    p3.join()
    p4.join()
    print (time.time()-t)

t2 = time.time()
for a in range(4):
    f()
print(time.time()-t2)

平均 3 次运行,具有多重处理的第一部分需要 17.15 秒,而不具有多重处理的第二部分需要 6.24 秒。使用 Windows 任务管理器,我发现我的计算机在第一部分中确实使用了 100% 的 CPU,在第二部分中仅使用了 25%,而且我并没有耗尽内存。

为什么这个程序在多处理的情况下会慢很多?

最佳答案

Windows 没有 fork(),因此多处理必须通过在每次启动新进程时导入 __main__ 模块来解决这个问题。

这意味着当每个子进程运行时,它不仅运行目标函数,还运行文件末尾的部分。将其移至方 block 中,速度应该会更快!

关于python - Python 中的多重处理比没有时慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17118781/

相关文章:

javascript - 从 Python BeautifulSoup 中的 javascript 源中提取值

python - 使用 writer.sheets 方法时的 Pandas.ExcelWriter KeyError

python - 多个进程从 Python 中的中央源读取的快速方法?

Python 多处理 map_async 挂起

python - 无法将更大的 DataFrames 放入队列中

python - 如何使用对象比较函数反转 heapq 堆中元素的顺序?

python - Python 缺少 frozen-dict 类型的解决方法?

Python:获取 ParquetDataset 的行数?

assembly - 在引导加载程序中初始化单独的 CPU 内核

c - 多CPU作业的用户时间增加