• python提高运算速度的方法:内存缓存+磁盘缓存


    对那些需要高频率以相同参数运行的函数,或者需要重复加载的数据,如果每次都执行函数完整的代码,或者重复从文件加载数据进行处理,会试程序运行效率变低。改善效率可通过使用内存缓存或磁盘缓存的形式,从而提高代码效率。

    1 内存缓存 lru_cache

    适用条件:函数经常需要以相同输入参数执行。

    效果:以参数args执行函数时,如果内存缓存中记录了相同输入参数的运行结果,则函数直接从缓存中返回结果,不在执行函数体的代码。

    举例:

    1. import functools
    2. SIZE_CACHE = 1 # 缓存大小
    3. @functools.lru_cache(SIZE_CACHE)
    4. def my_add(a, b):
    5. print("函数体被执行")
    6. return a+b
    7. if __name__ == "__main__":
    8. print("第一次运行结果。缓存为空,需要函数体")
    9. print(my_add(1, 1), '\n')
    10. print("第二次运行结果。由于缓存已有a=1,b=1的结果,所以函数体不执行")
    11. print(my_add(1, 1), '\n')
    12. print("第三次运行结果。缓存中没有a=1,b=2的结果,函数体要执行")
    13. print(my_add(1, 2), '\n')
    14. print("第四次运行结果。缓存中已变为a=1,b=2的结果,a=1,b=1的缓存已被覆盖,所以函数体执行")
    15. print(my_add(1, 1), '\n')

    运行结果:

    1. 第一次运行结果。缓存为空,需要函数体
    2. 函数体被执行
    3. 2
    4. 第二次运行结果。由于缓存已有a=1,b=1的结果,所以函数体不执行
    5. 2
    6. 第三次运行结果。缓存中没有a=1,b=2的结果,函数体要执行
    7. 函数体被执行
    8. 3
    9. 第四次运行结果。缓存中已变为a=1,b=2的结果,a=1,b=1的缓存已被覆盖,所以函数体执行
    10. 函数体被执行
    11. 2

    2 磁盘缓存 diskcache

    如果需要经常从文件读取数据进行预处理,可以将预处理结果存到磁盘缓存中,这样下次可直接读取磁盘缓存的结果,省去数据处理的实际。磁盘缓存有很多第三方库,其中一个为diskcache

    适用条件:频发加载数据,比如机器学习加载数据集。

    效果:可提高数据加载速度。

    举例:

    1. from diskcache import FanoutCache
    2. import time
    3. my_cache = FanoutCache(r"D:/my_cache",
    4. shards=64, # 将缓存文件自动分成64个部分
    5. timeout=1,
    6. size_limit=3e11, # 每个部分文件的文件最大占用空间
    7. # disk_min_file_size=2**20, # 文件最小尺寸
    8. )
    9. @my_cache.memoize(typed=True)
    10. def data_process(a=1):
    11. # 加载,处理文件数据,生产数据data, 假设生产的数据为[1, 2, 3]
    12. data = [1, 2, 3]
    13. time.sleep(3)
    14. return data
    15. if __name__ =='__main__':
    16. t1 = time.time()
    17. data_process(a=2)
    18. delt_t = time.time() - t1
    19. print("第一次运行使用时间: ", delt_t, '\n')
    20. t1 = time.time()
    21. data_process(a=2)
    22. delt_t = time.time() - t1
    23. print("第二次运行使用时间: ", delt_t, '\n')

    运行结果如下。对比可知,缓存之后,函数体代码并未执行,返回的是磁盘缓存的数据。 

    1. 第一次运行使用时间: 3.0158493518829346
    2. 第二次运行使用时间: 0.0

    保存的缓存文件如下,可见数据被缓存成了64个文件夹保存:

     

  • 相关阅读:
    深度解读面试题:链表中环的入口结点(附代码,可过在线OJ)
    Day9力扣打卡
    Linux 关闭对应端口号进程
    尚硅谷kafka3.0.0
    ​LeetCode解法汇总2760. 最长奇偶子数组
    【漏洞复现】广联达OA漏洞合集(信息泄露+SQL注入+文件上传)
    大数据从入门到精通(超详细版)之Hive案例,指标统计, Sql语句的编写
    基于springboot,vue疫情防疫管理系统
    swift开发moya,解决http网站无法访问
    『C++成长记』类和对象
  • 原文地址:https://blog.csdn.net/wxyczhyza/article/details/127773721