普通 python 代码和多处理中的相同代码之间的时间差是多少?

Posted

技术标签:

【中文标题】普通 python 代码和多处理中的相同代码之间的时间差是多少?【英文标题】:What is the time difference between a normal python code and the same code in multiprocessing? 【发布时间】:2019-07-08 12:45:40 【问题描述】:

我试图清楚地了解单个进程中的功能和多核中的相同功能的区别。以下普通 python 代码和多处理器代码给出了相同的时间(大约)。我使用多处理错误吗?

普通 Python 代码:

import time

def basic_func(x):
    if x == 0:
        return 'zero'
    elif x % 2 == 0:
        return 'even'
    else:
        return 'odd'


def multiprocessing_func(x):
    y = x * x
    print(' squared results in a/an  number'.format(x, basic_func(y)))


if __name__ == '__main__':
    starttime = time.time()
    for each in range(0, 1000):
        multiprocessing_func(each)
    print('That took  seconds'.format(time.time() - starttime))

多处理代码:

import time
import multiprocessing


def basic_func(x):
    if x == 0:
        return 'zero'
    elif x % 2 == 0:
        return 'even'
    else:
        return 'odd'


def multiprocessing_func(x):
    y = x * x
    print(' squared results in a/an  number'.format(x, basic_func(y)))


if __name__ == '__main__':
    starttime = time.time()
    pool = multiprocessing.Pool()
    pool.map(multiprocessing_func, range(0, 1000))
    pool.close()
    print('That took  seconds'.format(time.time() - starttime))

提前致谢! 代码来源:This tutorial

【问题讨论】:

您忘记添加time.sleep(2)(来自该示例) 要并行化的目标函数非常简单。进程管理和 python 解释器等的开销将明显大于执行实际“工作”所需的时间。将 multprocessing_func 变成实际上需要很长时间的东西,例如time.sleep(10) 而不是 y = x * x @TomDalton,好吧,你的意思是说,除非执行我们的功能所花费的时间明显更长,否则多处理通常会因为进程管理而变慢。 是的,完全正确 【参考方案1】:

在没有多处理的情况下,我在 0.07 秒内执行了这段代码。多处理版本耗时 0.28 秒。创建一些进程池需要一些时间,而且可能不值得。

我建议不要在此过程中打印,因为它可能会产生漏斗效应(I/O 始终是并发进程的问题)

稍微修改一下你的代码:

import time
import multiprocessing

def basic_func(x):
    if x == 0:
        return 'zero'
    elif x % 2 == 0:
        return 'even'
    else:
        return 'odd'


def multiprocessing_func(x):
    y = x * x
    return basic_func(y)

并比较结果:

starttime = time.time()
for each in range(0, 100000000):
        multiprocessing_func(each)
print('That took  seconds'.format(time.time() - starttime))

耗时 34 秒

starttime = time.time()
pool = multiprocessing.Pool(processes=10)
pool.map(multiprocessing_func, range(0, 100000000))
pool.close()
print('That took  seconds'.format(time.time() - starttime))

耗时 9.6 秒

看到“相同”的问题产生了截然不同的结果。回答您的问题是不可能的,这在很大程度上取决于最初的问题、漏斗效应以及任务持续时间与创建流程池的成本之间的平衡。

【讨论】:

谢谢!这清楚地解释了。当我们的目标功能较小时,创建流程和流程管理的成本不可忽略。

以上是关于普通 python 代码和多处理中的相同代码之间的时间差是多少?的主要内容,如果未能解决你的问题,请参考以下文章

Python 代码覆盖率和多处理

python-daemon 和多处理库之间的区别

python多进程数据库储存问题?

为啥 oracle 存储 java 过程中的相同代码可能比普通 java 慢?

122 Python程序中的多进程和多线程

Python中的多线程和多处理有什么用?