python - 不同运行函数方式之间的性能差异

标签 python performance

我希望这不是一个重复的问题。

我在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/

相关文章:

python - Word2Vec 模型未进行训练,输入句子尝试使用列表中的句子序列和标记化单词

performance - 附加到向量的效率

python - 如何解决 python 代码运行缓慢的问题

c++ - 在一个大文件上进行许多小的盲写的最快方法(在 C++ 中)?

c - 在c中构建未知长度的大字符串

javascript - 页面上具有多个动画的 Web 浏览器绘制率

python - 如何使用 flask 将异步请求发送到具有小超时 session 的端点?

python - 如何在 Pandas 的 groupby 对象中获取组数?

python - 未找到 subprocess.call 和 os.system 返回

Python 子图无法正常工作