码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • python加速记录


    目录

    • 加速方式记录
      • **Concurrent.futures**
      • Multiprocessing
    • 进程、线程与协程的比较
      • 协程介绍-廖雪峰
      • 多进程和多线程,应该选择哪个?
      • 并行化panoptic seg之后,输出空的json文件
      • 多进程读入到同一个字典里
      • 多进程控制使用的cpu数目
      • 多线程批量处理图像

    加速方式记录

    Concurrent.futures

    # 线程池:
    
    from concurrent.futures import ThreadPoolExecutor
    with ThreadPoolExecutor(max_workers=5) as executor:
         executor.map(function, iterable)
    
    # 进程池:
    
    from concurrent.futures import ProcessPoolExecutor
    with ProcessPoolExecutor(max_workers=5) as executor:
         executor.map(function, iterable)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    官方参考资料:https://pythonhosted.org/futures/
    下面是一个重要实例

    from concurrent.futures import ProcessPoolExecutor
    from functools import partial
    
    with ProcessPoolExecutor(max_workers=50) as executor:
    	# 默认参数在这里输入进去
        func = partial(
            conf_matrix_per_image,
            num_classes=xxx,
            cls_mapping=xxx)
        # 注意:结果可以被顺序收集
        rets = executor.map(func, preds, gt_files) # 这里的参数是可迭代参数,比如list
    
    conf_matrix = np.zeros(
        [seg_num_classes, seg_num_classes],
        dtype=np.float64,
    )
    for ret in rets:
        conf_matrix += ret
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    如果需要tqdm进度条

    with ProcessPoolExecutor(max_workers=8) as executor:
        list(tqdm(executor.map(do_process, lines), total=len(lines)))
    
    • 1
    • 2

    相比于Multiprocessing,本质区别并不大,有的也只是调用方式略有差异。先有的 multiprocessing,后有的 concurrent.futures,后者的出现就是为了降低编写代码的难度,后者的学习成本较低。

    参考https://cloud.tencent.com/developer/article/1752132

    Multiprocessing

    既能多线程,也可以多进程

    Multiprocessing 即有线程池,也是进程池,简单的使用方法如下:
    
    # 线程池:
    
    from multiprocessing.dummy import Pool as ThreadPool
    with ThreadPool(processes=100) as executor:
        executor.map(func, iterable)
        
    
    # 进程池:
    
    from multiprocessing import Pool as ProcessPool
    with ProcessPool(processes=10) as executor:
        executor.map(func, iterable)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    下面是个实例,也可以这么写,并且经过我的尝试,这样写更快。

    # 也可以直接这么写,
    for idx_in_batch in range(batch_size):
        p = Process(target=per_batch_processing, args=(
            batch_fns, 
            idx_in_batch, 
        ))
        p.start()
        processing.append(p)
    
        # all over
        for process in processing:
            process.join()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    进程、线程与协程的比较

    https://blog.csdn.net/Blateyang/article/details/78088851

    协程介绍-廖雪峰

    https://www.liaoxuefeng.com/wiki/1016959663602400/1017968846697824

    多进程和多线程,应该选择哪个?

    对于IO密集型任务:

    单进程单线程直接执行用时:10.0333秒
    多线程执行用时:4.0156秒
    多进程执行用时:5.0182秒
    说明多线程适合IO密集型任务。

    对于计算密集型任务

    单进程单线程直接执行用时:10.0273秒
    多线程执行用时:13.247秒
    多进程执行用时:6.8377秒
    https://blog.csdn.net/guyue35/article/details/92383687

    并行化panoptic seg之后,输出空的json文件

    for ...
        for ..
            write json
            write txt
    
    • 1
    • 2
    • 3
    • 4

    因为并行的时候不容易写入同一个 json (当然也可以使用apply_async,但是只能写入同一个json)
    https://blog.csdn.net/qq_45383393/article/details/106154967

    • 两个不相干的函数并行计算
      https://pythontechworld.com/article/detail/Ppj1ndikfYes
    • 多进程有序读取
      https://zhuanlan.zhihu.com/p/43781381

    多进程读入到同一个字典里

    • 使用共享对象
      https://stackoverflow.com/questions/28947581/how-to-convert-a-dictproxy-object-into-json-serializable-dict
    • 优化方法
      使用共享对象是执行多进程的不好方法, 更好的方法是收集每次调用的结果

    多进程控制使用的cpu数目

    https://donggeitnote.com/2020/07/20/python-multiprocessing/

    多线程批量处理图像

  • 相关阅读:
    云原生技术详解
    群晖DS220+ 应用小笔记
    八股文系列:程序开发中的集合容器,你了解多少?
    C语言面试题 - 指针声明
    jxTMS设计思想之流程追溯
    行业安全解决方案 | 零售企业如何做好安全建设对抗黑灰产?
    Optional避免判空嵌套过多,优雅解决空指针异常
    【软考软件评测师】第六章节 可靠性测试测试方法
    吊打面试官系列之:移动APP UI面试必备知识点,果然路转粉。
    【计组】指令系统
  • 原文地址:https://blog.csdn.net/qq_39575835/article/details/126407242
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号