首页 > 解决方案 > 为什么池和缓存方法具有几乎相同的运行时间?

问题描述

lru_cache 当我在没有得到这个结果的情况下运行代码时。这是可以理解的

多处理
时间耗时 0.4375
无多处理
时间耗时 8.8125

但是当我使用lru_cache这个运行时,结果是: 具有多处理时间的
Test1 花费了 0.34375 没有多处理 时间花费了 0.3125




具有多处理时间的Test2
需要 3.234375
没有多处理
时间需要 3.046875

我们可以清楚地看到,没有多处理的方法几乎等于或略快于多处理方法。这是什么原因?我知道创建过程是开销,但工作列表非常庞大(1000 万),所以我猜块大小不会太小。还是我这样做是错误的?

代码说明:
oddlist() 取数字,返回该范围内所有奇数之和
oddcount是一个包含1000万个随机数的元组

代码:

import os
from random import randint
from functools import reduce
from operator import add
from multiprocessing import Pool
import time
from functools import lru_cache

@lru_cache(maxsize=None)
def oddlist(num):
    return reduce(add,(i for i in range(num) if i&1))


if __name__ == '__main__':
    oddcounts=tuple(randint(10,50) for i in range(10000000))
    print('with multiporcessing')
    s=time.process_time()
    with Pool(12) as p:
        mp=p.map(oddlist, oddcounts)
    e=time.process_time()
    print(f'time took {e-s}')
    print('witout multiporcessing')
    s=time.process_time()
    z=tuple(oddlist(i) for i in oddcounts)
    e=time.process_time()
    print(f'time took {e-s}')

标签: pythoncachingmultiprocessing

解决方案


每个进程都有自己的缓存,因此在使用多处理时,缓存的效率是其他情况下的 1/12。奇数列表只有 40 个可能的输入值。在多处理情况下,每个进程计算全部 40,然后使用缓存。如果没有多重处理,所有 40 只计算一次。因此,除了启动进程的开销之外,如果缓存按预期工作,每个进程所做的工作都比它需要的要多。此外,将每个过程中要完成的工作传递给它,并将结果传回也是有成本的。


推荐阅读