当前位置: 首页 > news >正文

网站建设 佛山市建立网站的步骤

网站建设 佛山市,建立网站的步骤,h5响应式网站建设,搜索引擎优化seo什么意思原创:hxj7 本文以一个简单的例子介绍python中多线程和多进程的差别。我们在进行生信分析时经常要处理大文件,如果用串行运算往往费时,所以需要并行运算以节省时间。目前,流行的生信工具通常都可以并行运算,比如bwa。通…

c33f8efa0ca921b41a4425511558ee9c.png

原创:hxj7

本文以一个简单的例子介绍python中多线程和多进程的差别。

我们在进行生信分析时经常要处理大文件,如果用串行运算往往费时,所以需要并行运算以节省时间。目前,流行的生信工具通常都可以并行运算,比如bwa。通常来讲,我们进行并行运算可以选择多线程或者多进程。那么二者有什么差别呢,我们又该如何选择呢?

不同编程语言中的多线程和多进程实现机制是不一样的,其实我们不关心实现机制,我们关注的是实际的性能。本文以python语言为例,用一个测试脚本来比较python中多线程和多进程的性能区别。我们主要关注运行时间和内存占用情况。

我们知道,python中常用的多线程模块是threading,常用的多进程模块是multiprocessing。我们的测试脚本要解决的是一个运算量比较大的任务,根据是否(并行)运算以及使用哪种并行运算可以分为四种情形:

  • 不进行计算
  • 串行运算
  • 多线程运算
  • 多进程运算

得到的结果如下:

89192de7415ed45545654d3d60cb097b.png

从中可以看出,对这个运算任务以及测试脚本而言,与串行运算相比,多线程所用的时间多很多,所占的内存一样;而多进程所用的时间变少(大约是串行运算时间的一半),所占用的内存变大(大约是串行运算的三倍)。

上述结果值得讨论的有两个:

  1. 为什么python中多线程运算所用的时间比串行运算还多?
    这是因为python中GIL(Global Interpreter Lock)的存在使得对一个进程而言,不管有多少线程,任一时刻,只会有一个线程在执行。对于CPU密集型的线程,由于系统调度等其它时间花销,其效率不仅仅不高,反而有可能比较低[1]。也就是说,python中的多线程运算不能算作真正的并行运算。上面例子中的任务正好是一个CPU密集型任务,所以用多线程运算的时间反倒比串行运算还多。
  2. 为什么多线程运算占用的内存和串行运算一样,而多进程所用内存比串行运算大很多?
    这是一个正常的结果,是由线程和进程的特点决定的。简单来说,线程会共享所属进程的内存资源,所以不会有额外的内存占用;而子进程会从父进程那里拷贝一份内存资源,所以每多一个子进程,就会多一份内存资源的拷贝,占用的内存就多了,上面的例子中共有两个子进程,所以就会多出来两份内存拷贝,看起来所占用的内存就是串行运算的三倍。(所用的术语只是为了阐述方便而用,可能有不恰当的地方)

综上,由于生信分析大多是CPU密集型(计算密集型)的任务,如果你用python来处理此类任务,多进程并行运算可能更适合。

参考

[1] https://www.cnblogs.com/yssjun/p/11302500.html

所用的测试脚本如下:

#!/usr/bin/python
from threading import Thread 
from multiprocessing import Process
import time
import sysdef test_func(n):for _ in range(n):for i in a:j = i + 1print ja = [1] * 10000000  # 10M
ncore = 2
per_run = 20
total_run = ncore * per_runif __name__ == "__main__":start_time = time.time()if len(sys.argv) < 2:print "Usage: python %s <no-calc | serial | multi-thread | multi-process>" % sys.argv[0]sys.exit(1)cores = Noneif sys.argv[1] == "no-calc":time.sleep(1)elif sys.argv[1] == "serial":test_func(total_run)elif sys.argv[1] == "multi-thread":cores = [Thread(target = test_func, args=(per_run, )) for _ in range(ncore)]elif sys.argv[1] == "multi-process":cores = [Process(target = test_func, args=(per_run, )) for _ in range(ncore)]else:print "Usage: python %s <no-calc | serial | multi-thread | multi-process>" % sys.argv[0]sys.exit(3)if cores:for cr in cores:cr.start()for cr in cores:cr.join()end_time = time.time()print end_time - start_time

(公众号:生信了)

http://www.lbrq.cn/news/2584297.html

相关文章:

  • 沉默是金歌词南京seo新浪
  • 学做陶艺作品的网站某个产品营销推广方案
  • 页面设计理念怎么写seo推广优化的方法
  • 黄山网站建设费用网络营销个人感悟小结
  • 常见的网站类型有哪些软文范例大全500
  • 个人备案可以做门户网站吗seo优化排名公司
  • 泰州网站建设案例友情链接是啥意思
  • 仿做网站google学术搜索
  • 如何知道网站是用什么语言做的推广一次多少钱
  • 网站建设登录页面怎么写重庆做网络优化公司电话
  • 可信网站身份认证百度关键词收录排名
  • 哪些网站做的最好百度电脑版官网
  • 网站建设好后如何提交搜索引擎济南seo的排名优化
  • 手表哪个网站做的好中国数据统计网站
  • 怎样做可以互动留言的网站免费发布信息
  • 快速做网站公司报价海外市场推广方案
  • 成都网站建设哪家好友情链接是什么意思
  • 自己家的电脑宽带50m做网站服务器2024年疫情还会封控吗
  • 新疆建设兵团二师网站网页生成
  • 常州网站建设市场百度推广账号怎么申请
  • 做网站需要的公司油烟机seo关键词
  • 网站做电话线用国际新闻快报
  • 广州市从化区住房和建设据网站seo关键词优化
  • 网站设计服务表新网站怎么做优化
  • 咸宁网站制作培训制作一个简单的网站
  • 合理的网站结构鞍山seo外包
  • 家庭网做网站线上推广的三种方式
  • 江西省工程建设信息官方网站品牌策划设计
  • 怎么做门户网站设计安卓优化大师hd
  • 桐乡哪里有做网站的软件制作平台
  • Day22--回溯--77. 组合,216. 组合总和 III,17. 电话号码的字母组合
  • 构造类型--结构体,共同体联合体,枚举
  • 八股取士--docker
  • 查看主板信息的3种方法
  • Vue2 项目实现 Gzip 压缩全攻略:从配置到部署避坑指南
  • Java与Kotlin中“==“、“====“区别