我用Python编写了以下代码:
from concurrent.futures import ProcessPoolExecutor, \
ThreadPoolExecutor, \
as_completed
import random
import time
def addS(v):
s=0
start=time.time()
for i in range(0,len(v)):
s=s+v[i]
start1=time.time()
print ("sec time ",start1-start," sum is ",s)
def dummyFun(l):
s=0
for i in range(0,len(l)):
s=s+l[i]
return s
def main():
workers=4
v = [random.randint(1,101) for _ in range(1000000)]
addS(v)
dim=(int)(len(v)/(workers*10))
s=0
chunks=(v[k:k+dim] for k in range(0,len(v),(int)(len(v)/(workers*10))))
start=time.time()
with ProcessPoolExecutor(max_workers=4) as executor:
futures=[executor.submit(dummyFun,chunk) for chunk in chunks]
start1=time.time()
for future in as_completed(futures):
s=s+future.result()
print ("concurrent time ",start1-start," sum is ",s)
当我使用
ProcessPoolExecutor()
时,我的结果如下:
sec time 0.06529831886291504 sum is 51004089
concurrent time 0.5757372379302979 sum is 51004089
我也改成了
ThreadPoolExecutor()
,结果是:
sec time 0.06471061706542969 sum is 50981197
concurrent time 0.09298276901245117 sum is 50981197
另外,当我将
max_workers
参数设置为 None
时,我得到了以下结果:
sec time 0.06425285339355469 sum is 50983899
concurrent time 0.09010934829711914 sum is 50983899
如何提高并发时间?因为顺序时间一直越来越快还是有原因?
问:“如何提高并发时间?”
避免所有流程实例化成本,并使用内存 I/O 高效矢量化代码来完成其余部分,最好与
numpy
-广播 结合使用
s = np.random.randint( 1, 101, size = 1_000_000, dtype = np.int8 ).sum()
硬件 AVX 性能可以胜过任何其他纯软件技巧。
对于测试来说,首先并始终预先设定是公平的
np.random.seed( seed = someHausNumero )
否则所有测试都不再可重复,每次都会提供不同的结果,这是严肃的、可重复的科学永远不会想要的,不是吗?
:o)
谢谢@user3666197,但我很怀疑为什么我的顺序时间比并发版本短?也许是因为Python中的列表操作被优化了? – 小13分钟前
拥有少量项目(
1E6
是数据的一小部分)、流程实例化和类似的...PoolExecutor()
管理费用会带来比拆分工作至少能够偿还的更多成本。收支平衡状态(没有付出比以往更多的回报)。尝试对离缓存、内存 I/O 更密集的大小进行相同的操作,远高于 1E10+
字节(假设您有足够的 RAM/交换空间,当然)
虽然上面的问题是处理任务流的“只是”-
[ CONCURRENT ]
编排,但您可能想阅读有关附加开销成本和工作原子性的一些详细信息,这两者都会影响与纯粹的[ SERIAL ]
(或顺序)工作流程相比,实际可实现的最大加速>>> https://stackoverflow.com/revisions/18374629/3
附加成本的性质是相同的 - 参数需要 SER/comms/DES + 结果需要 SER/comms/DES 以及所有这些都来自内存分配附加成本和内存 I/O 成本 - 其中看到这个>>> https://stackoverflow.com/questions/4087280/approximate-cost-to-access-various-caches-and-main-memory/33065382?r=SearchResults&s=2|0.0000#33065382