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

时间:2017-01-10 16:51:29

标签: python performance

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

我已经以简单方式和多处理方式在Python 3.4.2中运行相同的功能,并且我发现了简单的方法就是更快。也许我的设计不好,但我不知道问题所在。

以下是我的代码:

公共部分

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

1 个答案:

答案 0 :(得分:1)

计算Capybara.register_driver :chrome do |app| caps = Selenium::WebDriver::Remote::Capabilities.new caps["chromeOptions"] = {} caps["chromeOptions"]["args"] = %W( --no-sandbox --disable-plugins --use-fake-device-for-media-stream --use-fake-ui-for-media-stream --start-maximized --disable-notifications ) Capybara::Selenium::Driver.new(app, :browser => :chrome, :desired_capabilities => caps) end ,其中x <100(就像你的情况一样)并不是特别困难。因此,如果不同时计算这些并不能提供明显的优势。

请记住,当您设置多个进程时,还会产生创建新进程和复制内存空间等的开销。

最后,关于为该列表中的每个数字创建新流程,您可以说些什么。如果该列表中包含100个数字,那么您将创建100个新进程,这将在4或8个核心上竞争时间(取决于您的CPU),这将进一步延迟(特别是当计算本身变得复杂时) )。您最好创建一个流程池并让它们逐步处理您的数据集:

math.exp(x)