Python concurrent.futures.ThreadPoolExecutor比列表理解速度慢
我正在使用列表理解vs.concurrent.futures测试一个简单的函数:Python concurrent.futures.ThreadPoolExecutor比列表理解速度慢,python,concurrency,Python,Concurrency,我正在使用列表理解vs.concurrent.futures测试一个简单的函数: class Test: @staticmethod def something(times = 1): return sum([1 for i in range(times)]) @staticmethod def simulate1(function, N): l = [] for i in range(N):
class Test:
@staticmethod
def something(times = 1):
return sum([1 for i in range(times)])
@staticmethod
def simulate1(function, N):
l = []
for i in range(N):
outcome = function()
l.append(outcome)
return sum(l) / N
@staticmethod
def simulate2(function, N):
import concurrent.futures
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
l = [outcome for outcome in executor.map(lambda x: function(), range(N))]
return sum(l) / N
@staticmethod
def simulate3(function, N):
import concurrent.futures
l = 0
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
futures = [executor.submit(function) for i in range(N)]
for future in concurrent.futures.as_completed(futures):
l += future.result()
return l / N
def simulation():
simulationRate = 100000
import datetime
s = datetime.datetime.now()
o = Test.simulate1(lambda : Test.something(10), simulationRate)
print((datetime.datetime.now() - s))
s = datetime.datetime.now()
o = Test.simulate2(lambda : Test.something(10), simulationRate)
print((datetime.datetime.now() - s))
s = datetime.datetime.now()
o = Test.simulate3(lambda : Test.something(10), simulationRate)
print((datetime.datetime.now() - s))
simulation()
测量时间,我得到:
0:00:00.258000
0:00:10.348000
0:00:10.556000
我刚开始学习并发性,所以我不知道什么是阻碍线程更快运行的瓶颈。如果将任务函数更改为此,您将看到不同之处:
def something(n):
""" simulate doing some io based task.
"""
time.sleep(0.001)
return sum(1 for i in range(n))
在我的mac pro上,它提供:
0:00:13.774700
0:00:01.591226
0:00:01.489159
这一次,并发的未来显然更快了
原因是:您正在模拟一个基于cpu的任务,因为python的GIL,concurrent.future会使它变慢
concurrent.future为异步执行可调用项提供了一个高级接口,您在错误的场景中使用了它。如果将任务函数更改为此,您将看到区别:
def something(n):
""" simulate doing some io based task.
"""
time.sleep(0.001)
return sum(1 for i in range(n))
在我的mac pro上,它提供:
0:00:13.774700
0:00:01.591226
0:00:01.489159
这一次,并发的未来显然更快了
原因是:您正在模拟一个基于cpu的任务,因为python的GIL,concurrent.future会使它变慢
concurrent.future为异步执行可调用项提供了一个高级接口,但您在错误的场景中使用了它