我希望这不是一个重复的问题。
我在Python 3.4.2中以简单方式和多处理方式运行了相同的函数,我发现简单的方法是快点。也许我的设计不好,但我不知道问题出在哪里。
下面是我的代码:
公共(public)部分
import os
import math
from multiprocessing import Process
import timeit
def exponential(number):
"""
A function that returns exponential
"""
result = math.exp(number)
proc = os.getpid()
简单的解决方案
if __name__ == '__main__':
start = timeit.default_timer()
numbers = [5, 10, 20, 30, 40, 50, 60]
for index, number in enumerate(numbers):
exponential(number)
stop = timeit.default_timer()
duration = stop - start
print(duration)
多处理解决方案
if __name__ == '__main__':
start = timeit.default_timer()
numbers = [5, 10, 20, 30, 40, 50, 60]
procs = []
for index, number in enumerate(numbers):
proc = Process(target=exponential, args=(number,))
procs.append(proc)
proc.start()
for proc in procs:
proc.join()
stop = timeit.default_timer()
duration = stop - start
print(duration)
我发现简单的解决方案比多处理解决方案更快:
Duration with Simple solution: 2.8359994757920504e-05
Duration with Multi processing solution: 0.012581961986143142
最佳答案
计算math.exp(x)
,其中x<100(正如您的情况)并不是特别困难。因此,不并行计算这些并不能提供明显的优势。
请记住,当您设置多个进程时,您还会产生创建新进程、复制内存空间等开销。
最后,有一些关于您为该列表中的每个数字创建新进程的事情要说。如果该列表中有 100 个数字,您将创建 100 个新进程,这些进程将在您的 4 或 8 核上争夺时间(取决于您的 CPU),这将进一步增加延迟(尤其是当计算本身变得复杂时) )。您最好创建一个进程池并让它们逐步处理您的数据集:
import math
import multiprocess as mp
def slave(qIn, qOut):
for i, num in iter(qIn.get, None):
qOut.put((i, math.exp(num))
qOut.put(None)
def master():
numbers = [5, 10, 20, 30, 40, 50, 60]
qIn, qOut = [mp.Queue() for _ in range(2)]
procs = [mp.Process(target=slave, args=(qIn, qOut)) for _ in range(mp.cpu_count()-1)]
for p in procs: p.start()
for t in enumerate(numbers): qIn.put(t)
for p in procs: qIn.put(None)
answer = [None] * len(numbers)
done = 0
while done < len(numProcs):
t = qOut.get()
if t is None:
done += 1
continue
i, e = t
answer[i] = e
for p in procs: p.terminate()
return answer
关于python - 不同运行函数方式之间的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41574076/