Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.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_Python 2.7_Python Multiprocessing - Fatal编程技术网

Python多处理似乎比常规执行慢

Python多处理似乎比常规执行慢,python,python-2.7,python-multiprocessing,Python,Python 2.7,Python Multiprocessing,在下面的代码中,我正在生成一个编号为9999的多维数据集,并通过线程池和普通方法调用该多维数据集 我正在计算两者之间的差异。看起来正常的方法要快得多。我在一个i7第8代intel处理器上运行它,在Python2.7终端内有16千兆ram 我对此感到困惑。也许我错过了什么。我希望这个问题对未来的人们有所帮助 import time from multiprocessing.pool import ThreadPool def cube(): return 9999*9999*9999

在下面的代码中,我正在生成一个编号为9999的多维数据集,并通过线程池和普通方法调用该多维数据集

我正在计算两者之间的差异。看起来正常的方法要快得多。我在一个i7第8代intel处理器上运行它,在Python2.7终端内有16千兆ram

我对此感到困惑。也许我错过了什么。我希望这个问题对未来的人们有所帮助

import time
from multiprocessing.pool import ThreadPool

def cube():
    return 9999*9999*9999

print "Start Execution Threading: "
x = int(round(time.time() * 1000))
pool = ThreadPool()

for i in range(0,100):
  result = pool.apply_async(cube, ())
  result = pool.apply_async(cube, ())
  result = pool.apply_async(cube, ())
  # print result.get()

pool.close()
pool.join()

print "Stop Execution Threading: "
y = int(round(time.time() * 1000))

print y-x

print "Start Execution Main: "
x = int(round(time.time() * 1000))

for i in range(0,100):
  cube()
  cube()
  cube()

print "Stop Execution Main: "
y = int(round(time.time() * 1000))
print y-x

多处理意味着您将启动一个新线程。这会带来相当大的开销,因为它必须初始化。因此,多线程只会带来回报,尤其是在python中,当您并行化任务时,这些任务本身需要相当长的时间来执行(与python启动时间相比),并且可以允许异步运行


在你的例子中,一个简单的乘法运算执行得如此之快,它不会有回报。

多处理意味着你将启动一个新线程。这会带来相当大的开销,因为它必须初始化。因此,多线程只会带来回报,尤其是在python中,当您并行化任务时,这些任务本身需要相当长的时间来执行(与python启动时间相比),并且可以允许异步运行


在您的情况下,一个简单的乘法执行得太快了,它不会得到回报。

由于来自多处理的
。pool import ThreadPool
,您使用的是多线程,而不是多处理。CPython使用全局解释器锁来防止多个线程同时执行Python代码

因此,由于您的程序是CPU受限的,因此您增加了线程开销,但由于GIL,因此没有任何好处。多线程在Python中对于IO有界的问题是有意义的,因为一个线程可以在其他线程等待IO完成时运行


您可以尝试使用真正的多处理,因为这样每个Python进程都会有自己的GIL,但我仍然不确定其收益,因为进程之间的通信会增加更多的开销…

由于来自多处理的
。pool import ThreadPool
,您使用的是多线程,而不是多处理。CPython使用全局解释器锁来防止多个线程同时执行Python代码

因此,由于您的程序是CPU受限的,因此您增加了线程开销,但由于GIL,因此没有任何好处。多线程在Python中对于IO有界的问题是有意义的,因为一个线程可以在其他线程等待IO完成时运行


您可以尝试使用真正的多处理,因为这样每个Python进程都会有自己的GIL,但我仍然不确定其收益,因为进程之间的通信会增加更多开销…

%timeit 9999*9999*9999 19.3 ns±3.18 ns/循环(平均±标准偏差为7次运行,每个循环10000000次)
。这不是用于
多处理的作业。仅仅生成一个池的开销使得这种方法变得多余。我不相信这种计算会从低级语言中的其他核心中受益,但在python中,您实际上必须生成整个新的python进程,将所有名称空间复制到新进程,这里没有任何东西可以跨核心协同工作。
%timeit 9999*9999*9999每个循环19.3纳秒±3.18纳秒(平均±标准偏差为7次运行,每个循环10000000次)
。这不是用于
多处理的作业。仅仅生成一个池的开销使得这种方法变得多余。我不相信这种计算会从低级语言中的其他核心中受益,但在python中,您实际上必须生成整个新的python进程,将所有名称空间复制到新进程,这里没有任何东西可以跨核心协同工作。您能否告诉我们,为了保证线程化,重复运行一段代码需要多少时间。正如您指出的,线程不需要乘法。比如说,读100个文本文件,每个文件100行,就可以保证线程。再次感谢。@PrabhakarShanmugam没有CPU限制的任务将通过线程更快。这里需要区分线程和进程。这是由于@Prabhakar Shanmugam:您基本上了解了python在程序中新进程的启动时间。所以,它需要按照你所看到的不同的顺序。但正如roganjosh所说:如果想要获得计算速度(而不是并行化I/O),就需要启动进程(而不是线程)。同样的库也提供了进程。roganjosh:你说得很对。你能告诉我们,为了保证线程化,重复运行一段代码需要多少时间。正如您指出的,线程不需要乘法。比如说,读100个文本文件,每个文件100行,就可以保证线程。再次感谢。@PrabhakarShanmugam没有CPU限制的任务将通过线程更快。这里需要区分线程和进程。这是由于@Prabhakar Shanmugam:您基本上了解了python在程序中新进程的启动时间。所以,它需要按照你所看到的不同的顺序。但正如roganjosh所说:如果想要获得计算速度(而不是并行化I/O),就需要启动进程(而不是线程)。同样的库也提供了进程。罗甘约什:你肯定是对的。