python - 为什么池和缓存方法具有几乎相同的运行时间?
问题描述
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}')
解决方案
每个进程都有自己的缓存,因此在使用多处理时,缓存的效率是其他情况下的 1/12。奇数列表只有 40 个可能的输入值。在多处理情况下,每个进程计算全部 40,然后使用缓存。如果没有多重处理,所有 40 只计算一次。因此,除了启动进程的开销之外,如果缓存按预期工作,每个进程所做的工作都比它需要的要多。此外,将每个过程中要完成的工作传递给它,并将结果传回也是有成本的。
推荐阅读
- vue.js - Vue.js 过滤器在本地工作,但不在服务器上
- python-3.x - 如何使用sql数据库在python中自动登录?
- unity3d - 用手指在 x 轴 3d 上移动对象
- firebase - 如何从 FCM 获取全屏通知?
- swiftui - 订阅 SwiftUI 视图到组合发布者的每次更新
- amazon-web-services - 使用 CDK 创建没有 NAT 网关的 AWS RDS 实例
- python - 将多个预处理步骤应用于 sklearn 管道中的列
- c# - 用于分配点符号方法的更快语法将值返回到原始变量
- javascript - 检查数组中的对象以获取特定字符串
- java - 如何在皮肤中获取 TextFieldStyle 光标?