我希望这不是一个重复的问题。
我已经以简单方式和多处理方式在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
答案 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)