【发布时间】:2019-08-19 00:21:32
【问题描述】:
我正在尝试使用 python multiprocessing 模块来减少过滤代码的时间。一开始我做了一些实验。结果并不乐观。
我已经定义了一个函数来在一定范围内运行一个循环。然后我在有和没有线程的情况下运行了这个函数并测量了时间。这是我的代码:
import time
from multiprocessing.pool import ThreadPool
def do_loop(i,j):
l = []
for i in range(i,j):
l.append(i)
return l
#loop veriable
x = 7
#without thredding
start_time = time.time()
c = do_loop(0,10**x)
print("--- %s seconds ---" % (time.time() - start_time))
#with thredding
def thread_work(n):
#dividing loop size
a = 0
b = int(n/2)
c = int(n/2)
#multiprocessing
pool = ThreadPool(processes=10)
async_result1 = pool.apply_async(do_loop, (a,b))
async_result2 = pool.apply_async(do_loop, (b,c))
async_result3 = pool.apply_async(do_loop, (c,n))
#get the result from all processes]
result = async_result1.get() + async_result2.get() + async_result3.get()
return result
start_time = time.time()
ll = thread_work(10**x)
print("--- %s seconds ---" % (time.time() - start_time))
对于 x=7,结果是:
--- 1.0931916236877441 seconds ---
--- 1.4213247299194336 seconds ---
没有线程,它需要更少的时间。这是另一个问题。对于 X=8,大多数时候我会得到 MemoryError 用于线程。一旦我得到这个结果:
--- 17.04124426841736 seconds ---
--- 32.871358156204224 seconds ---
解决方案很重要,因为我需要优化 filtering task,这需要 6 个小时。
【问题讨论】:
-
线程和多处理是两种不同的并行技术。根据代码,我猜你应该在你的问题中到处替换“线程”。
-
@tripleee ,我假设 ThreadPool() 函数正在创建不同的线程。
标签: python multithreading multiprocessing