Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >为啥我的Python这么慢 (一)

为啥我的Python这么慢 (一)

作者头像
生信宝典
发布于 2018-02-05 05:23:44
发布于 2018-02-05 05:23:44
65600
代码可运行
举报
文章被收录于专栏:生信宝典生信宝典
运行总次数:0
代码可运行

Python系列教程中,我们提到一个概念字符串是不可修改的。这一点可以通过id函数来判断确实是对的。但是这个概念会对我们写作程序有什么影响一直没有特别深的理解。

直到有一次,实验室一个朋友要读基因组数据,结果发现3 G的基因组读一晚上都没读完,就很诧异,看了下代码,这么写的。

基因组序列是GRCh38.faFASTA格式,序列行每行70个字符,共44,284,892行 (记住行数有多大),示例如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>chr1
NNNNN...(60N)...NNNNN
ACGTA...(60个Nt)...ACGTA
...
>chr2
NNNNN...(60N)...NNNNN
ACGTA...(60个Nt)...ACGTA
...

读取程序如下(这里只选了读取基因组的部分,点击查看更多FASTA的操作):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
aDict = {}
for line in open("GRCh38.fa"):
    if line[0] == '>':
        key = line[1:-1]
        aDict[key] = ''
    else:
        aDict[key]+=line.strip()

程序看上去没问题,获取id,读取一行"追加"在前一行后面,逻辑是对的。然后运行上程序,回去睡觉,满心欢喜期待第二天早上获得结果,结果啥也没出来,程序还停留在读取基因组序列步骤。

按我们服务器的性能,这不应该啊。看代码是不是出问题了,怎么看逻辑都对。后来就想会不会是序列累加的问题,换了一个写法。代码稍微长了些,先存入列表,再连接起来。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Dict = {}
for line in open("GRCh38.fa"):
    if line[0] == '>':
        key = line[1:-1]
        aDict[key] = []
    else:
        aDict[key].append(line.strip())
#--------------------------------
for key, value in aDict.items():
    aDict[key] = ''.join(value)

使用time函数,查看下运行速度,不足1分钟。time及更多程序监测方法见命令运行监测和软件安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
time readFaJoin.py 

real    0m51.256s
user    0m40.729s
sys    0m10.425s

不比不知道,一比吓一跳;速度差了何止几千倍。

这时,我们重新理解下什么叫字符串不可修改。

使用id函数来确定字符串累加跟列表累加的不同。(不同电脑或不同时间运行获得的id不同,不看具体数字,只看id的变化)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ehbio = "Sheng Xin Bao Dian"
id(ehbio)

## Output: 140405359946640

ehbio += ' very good'
ehbio

## Output: 'Sheng Xin Bao Dian very good'

id(ehbio)

## Output: 140405344262576

同样的变量名字,但不同的id。就是说python在对变量ehbio新增字符串时,是先开辟一份内存空间,把ehbio原有内容加新内容组成的字符串存入新的内存空间。而不是想象中的直接追加在已有字符串的后面。这样对4千万行数据的操作就是要做4千万次的内存空间开辟和字符串存储。这是一个特别耗时的步骤。

而如果是一个列表呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
aList = ['Sheng','Xin']

id(aList)

## Output: 140405344245520

aList.append("Bao")

id(aList)

## Output: 140405344245520

aList.extend(["Dian", "excellent"])

id(aList)

## Output: 140405344245520

而列表就不一样了,无论是使用append增加一个元素,还是使用extend增加一组元素,列表变量aListid都没有变化。说明这是追加,不是新建。

Python使用中还有不少类似这样的需要注意的小细节,在后续会陆续推出。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信宝典 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
来一份Python学习题
3*2**2的输出是多少?(1分) 8 % 4的输出是多少?(1分) 32 + '32'的输出是什么?(1分) 32 > '32'的输出是什么?(1分) 'Sheng Xin Bao Dian'.find('x')和'Sheng Xin Bao Dian'.find('X')的输出分别是?(2分) 一句话计算'Sheng Xin Bao Dian'字符串中n的数目?(1分) 写出下面10段程序的输出?(1分/段) aList = [1, 2, 3] bList = aList bList.append(4)
生信宝典
2018/03/30
1.1K0
为啥我的Python这么慢 - 项查找 (二)
上一篇为啥我的Python这么慢, 字符串的加和和join被陈群主分享到biopython-生信QQ群时,乐平指出字典的写法存在问题,并给了一篇知乎的链接https://zhuanlan.zhihu.com/p/28738634指导如何高效字典操作。 根据那篇文章改了两处写法,如下 (存储于readFaJoin2.py文件中): from collections import defaultdict aDict = defaultdict(list) for line in open("GRCh38.f
生信宝典
2018/02/05
9890
Bash概论 - Linux系列教程补充篇
本篇是我最开始学习Linux命令时看的一篇帖子,最早见于ChinaUnix (这次查找其出处时发现2002年就有这篇)。学习过程中,遇到问题就查一下。这次看到,把格式整理了,部分内容做了校对,增加了解释和示例,分享于此,也是对之前我们写的16篇Linux入门和生物信息常用Linux命令文章 (包括最基础操作、环境变量、可执行属性,命令行运行监测、常见错误、快捷操作、管道、标准输入输出、软件安装、Docker、Conda、定期备份、配置信息查询、awk、sed、vim)的补充。 Bash特殊字符 1.
生信宝典
2018/02/05
1.2K0
这个为生信学习打造的开源 Python 文字教程真香!!!
欢迎来到Python的世界,本教程将带你遨游Python,领悟Python的魅力。本教程专注于帮助初学者,尤其是生物信息分析人员快速学会Python的常用功能和使用方式,因此只精选了部分Python的功能,请额外参考Python经典教程A byte of python和它的中文版 来更好的理解Python. 本文档的概念和文字描述参考了A byte of python(中文版),特此感谢。
生信宝典
2022/01/18
1.5K0
这个为生信学习打造的开源 Python 文字教程真香!!!
基于Salmon的转录组定量流程
Salmon是不基于比对计数而直接对基因进行定量的工具,适用于转录组、宏基因组等的分析。
生信宝典
2020/12/15
3.6K0
Salmon构建索引的时间效率和计算效率明显高于STAR
前面我们评估了不同大小基因组基于STAR构建索引所需的计算资源和时间资源、不同大小数据集基于STAR进行比对所需的计算资源和时间资源和STAR比对速度与分配线程的关系。
生信宝典
2022/01/18
5210
Salmon构建索引的时间效率和计算效率明显高于STAR
全基因组 - 人类基因组变异分析(PacBio) (3)-- pbmm2
长读段比对算法与一代/二代测序数据的比对算法有很大的不同,因为长读段通常更长、包含更多错误和变异,并且需要更复杂的比对策略。
三代测序说
2023/10/26
1.3K1
全基因组 - 人类基因组变异分析(PacBio) (3)-- pbmm2
Python学习没有捷径,但可以加速,零基础九天你也可以会编程
在小学生都学Python了,你还不知道怎么开始文中介绍了Python的应用广泛,功能强大,提供了Python的在线学习视频和资料等 (收集资料是我们的最爱)。 学习程序语言不是一件难事,也不是一件简单
生信宝典
2018/02/05
8800
Python学习没有捷径,但可以加速,零基础九天你也可以会编程
生信分析过程中这些常见文件的格式以及查看方式你都知道吗?
生信分析过程中,会与很多不同格式的文件打交道,除了原始测序数据fastq之外,还需要准备基因组文件fasta格式和基因注释文件gtf格式。在分析的过程中还会有众多中间文件的生成,如bed、bed12、sam、bam、wig、bigwig、bedgraph等,生成后我们一般会查看下内容了解文件每一列的含义,以此来决定需要提取哪些有用信息列来进行下一步分析。
生信宝典
2019/10/14
2.6K0
生信分析过程中这些常见文件的格式以及查看方式你都知道吗?
Python学习教程 (四)
Python 教程 欢迎来到Python的世界,本教程将带你遨游Python,领悟Python的魅力。本教程专注于帮助初学者,尤其是生物信息分析人员快速学会Python的常用功能和使用方式,因此只精选了部分Python的功能,请额外参考Python经典教程A byte of python和它的中文版 来更好的理解Python. 本文档的概念和文字描述参考了A byte of python(中文版),特此感谢。 This work is licensed under a Creative Commons A
生信宝典
2018/02/05
1.8K0
全长转录组 | Iso-Seq 三代测序数据分析流程 (PacBio) (2) -- pigeon
Isoseq 数据分析第一部分我们最后使用了isoseq cluster 获得了聚类后高质量的转录本,但是我们仍然不知道这些经过聚类的转录本在基因组的位置以及属于哪些基因?这些转录本是已经注释的还是新的isoform?每个聚类是否能够进一步合并?每个isoform的表达量情况?下面我们通过使用isoseq collapse和 pigeon对转录本(isoforms)进行在参考基因组指导下的进一步合并(collapse),注释,分类和定量。
三代测序说
2024/01/25
2K0
全长转录组 | Iso-Seq 三代测序数据分析流程 (PacBio) (2) -- pigeon
如何快速从基因组中提取基因、转录本、蛋白、启动子、非编码序列?
NGS基础 - GTF/GFF文件格式解读和转换这篇文章有读者留言想要提取外显子,内含子,启动子,基因体,非编码区,编码区,TSS上游1500,TSS下游500的序列。下面我们就来示范如何提取这些序列。
生信宝典
2022/01/18
5.4K0
什么配置的电脑可满足基因组索引构建的需求?
经常有朋友问起自己要做什么分析,推荐一个电脑的配置。通常限制程序运行的最主要因素是内存,内存不足程序会直接运行不起来,CPU性能弱顶多是运行的慢,硬盘比较便宜,不需要特别评估。
生信宝典
2022/01/18
6750
什么配置的电脑可满足基因组索引构建的需求?
Python学习极简教程 (一)
Python 教程 欢迎来到Python的世界,本教程将带你遨游Python,领悟Python的魅力。本教程专注于帮助初学者,尤其是生物信息分析人员快速学会Python的常用功能和使用方式,因此只精选了部分Python的功能,请额外参考Python经典教程A byte of python和它的中文版 来更好的理解Python. 本文档的概念和文字描述参考了A byte of python(中文版),特此感谢。 This work is licensed under a Creative Commons A
生信宝典
2018/02/05
3K0
Python学习极简教程 (一)
玩转参考基因组
在研究基因序列层面变化的时候,对基因组序列有一个全面的认知及学会怎么对序列基本操作十分重要。
生信菜鸟团
2025/04/15
640
玩转参考基因组
Python学习教程(二)
输入输出 交互式输入输出 在很多时候,你会想要让你的程序与用户(可能是你自己)交互。你会从用户那里得到输入,然后打印一些结果。我们可以分别使用raw_input和print语句来完成这些功能。 a = raw_input("Please input a string\n> ") print "The string you typed in is: ", a Please input a string > a The string you typed in is: a print "这是一个保留例子,仅供
生信宝典
2018/02/05
1.4K0
Python学习教程(二)
特殊物种cellranger基因组质量评估
序列文件就是基因组的序列以fa格式存储,这里我们看到在GRCh38版本中染色体两端加了很多N。 从序列文件我们可以得到什么?
生信技能树jimmy
2020/06/04
1.2K0
特殊物种cellranger基因组质量评估
生信技能树-day18 转录组上游分析-比对、定量
今天的是三周合计15天的数据挖掘授课学员一点一滴整理的授课知识点笔记哦,还有互动练习题哈,欢迎大家点击文末的阅读原文去关注我们学员的公众号哦!
生信菜鸟团
2024/06/25
4550
生信技能树-day18 转录组上游分析-比对、定量
全基因组 - 人类基因组变异分析(PacBio) (4)-- DeepVariant
单核苷酸多态性(Single Nucleotide Polymorphism,SNP)指的是基因组中单个核苷酸腺嘌呤(A)、胸腺嘧啶(T)、胞嘧啶(C)或鸟嘌呤(G)在物种成员之间或个体配对染色体之间的差异, 是最常见也最简单的一类造成基因组多样性的DNA序列变异。
三代测序说
2023/11/12
1.8K2
全基因组 - 人类基因组变异分析(PacBio) (4)-- DeepVariant
转录组上游分析流程(四)
环境部署——数据下载——查看数据(非质控)——数据质控——数据过滤(过滤低质量数据)——数据比对及定量
凑齐六个字吧
2024/10/26
1550
转录组上游分析流程(四)
推荐阅读
相关推荐
来一份Python学习题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验