Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多处理中,普通python代码与相同代码之间的时间差是多少?_Python_Performance_Multiprocessing_Profiling - Fatal编程技术网

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

在多处理中,普通python代码与相同代码之间的时间差是多少?,python,performance,multiprocessing,profiling,Python,Performance,Multiprocessing,Profiling,我试图清楚地理解单个进程中的函数和多个核中相同函数的区别。下面的普通python代码和多处理器代码给出了相同的时间(近似值)。我使用多处理错误吗 普通Python代码: import time def basic_func(x): if x == 0: return 'zero' elif x % 2 == 0: return 'even' else: return 'odd' def multiprocessing_

我试图清楚地理解单个进程中的函数和多个核中相同函数的区别。下面的普通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))
提前谢谢!
代码源:

没有多重处理,我在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秒


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

您忘记了添加
时间。sleep(2)
(从该示例中)您要并行的目标函数非常简单。流程管理和python解释器等的开销将大大超过执行实际“工作”所需的时间。让multprocessing_func变成实际需要很长时间的东西,例如,
时间。sleep(10)
而不是
y=x*x
@TomDalton,好吧,你的意思是说,除非执行我们的函数所需的时间显著增加,否则多处理通常会因为进程管理而变得更慢。是的,这完全正确谢谢!这清楚地解释了这一点。当我们的目标功能很小时,创建流程和流程管理的成本是不可忽略的。