• 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个文件夹保存:

     

  • 相关阅读:
    短路语法 [SUCTF 2019]EasySQL1
    数仓开发之DWD层(三)
    Linux crontab 命令定时任务设置
    C++11(下)
    Linux环境sed工具的使用及工作原理
    9.11黄金今日会爆涨吗?黄金原油最新投资行情走势咨询
    Diffusion Models/Score-based Generative Models背后的深度学习原理(3):蒙特卡洛采样法和重要采样法
    技术管理杂谈
    音视频流媒体之 IJKPlayer FFmpeg Android 编译
    Docker Registry
  • 原文地址:https://blog.csdn.net/wxyczhyza/article/details/127773721