首页 > 编程语言 >为啥我的Python这么慢 (一)

为啥我的Python这么慢 (一)

时间:2023-05-07 23:34:26浏览次数:40  
标签:... 这么 Python 为啥 ehbio aDict key line id


长假结束了,这不痛苦。痛苦的是长假结束了,发现写的基因组读取程序还没运行完?

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

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

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

>chr1
NNNNN...(60个N)...NNNNN
ACGTA...(60个Nt)...ACGTA
...
>chr2
NNNNN...(60个N)...NNNNN
ACGTA...(60个Nt)...ACGTA
...

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

aDict = {}
for line in open("GRCh38.fa"):
    if line[0] == '>':
        key = line[1:-1]
        aDict[key] = ''
    else:
        aDict[key]+=line.strip()

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

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

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及更多程序监测方法见命令运行监测和软件安装

time readFaJoin.py 

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

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

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

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

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千万次的内存空间开辟和字符串存储。这是一个特别耗时的步骤。

而如果是一个列表呢?

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使用中还有不少类似这样的需要注意的小细节,在后续会陆续推出。

而且我们生信宝典团队要开培训班了,涉及Linux系统操作Python编程R Cytoscape作图高通量数据分析。如果您有需要我们解决的问题,还请后台留言,一并纳入培训班的授课。希望通过我们的努力,让培训发挥作用,不管是来学技术,来学理念,还是来解决你手头棘手的问题,希望都能有所收获。

具体日期静待公布。


标签:...,这么,Python,为啥,ehbio,aDict,key,line,id
From: https://blog.51cto.com/u_16077014/6252736

相关文章

  • 同行盆友来稿:初探Python变量
    什么是变量在Python编程语言中,变量是用于存储数据值的标识符。它们可以用来引用数据值,而不是直接使用值本身。可以使用等号(=)运算符来将一个值赋给一个变量。变量数据类型有那些变量类型有以下几种:1.整型(int):表示整数,例如:`42`、`-3`、`1000`等。2.浮点型(float):表示浮点数(即带......
  • Python程序与设计
    2-27在命令行窗口中启动的Python解释器中实现在Python自带的IDLE中实现print("Helloworld")编码规范每个import语句只导入一个模块,尽量避免一次导入多个模块不要在行尾添加分号“:”,也不要用分号将两条命令放在同一行建议每行不超过80个字符使用必要的空行可以增加代码的可读性运......
  • Python学习
    3-13字符串类型字符串类型:str   1.定义格式:       变量='内容'           打印一行       变量="内容"           打印一行       变量='''内容'''或者三引号           可以通过回车的方式换行,......
  • Python学习
    3-13字符串类型字符串类型:str   1.定义格式:       变量='内容'           打印一行       变量="内容"           打印一行       变量='''内容'''或者三引号           可以通过回车的方式换行,......
  • Python文本处理
     binascii—ConvertbetweenbinaryandASCII—Python3.11.3documentation Hackbright-challenges/hexconvert.pyatmaster·kritikadusad/Hackbright-challenges·GitHub hex2bin/hex2bin.pyatmain·jasonalexander-ja/hex2bin(github.com)importre......
  • 工作提效___python实现测试用例统计
    一、工作中存在的问题:1、被测项目不断迭代增加新功能,功能模块越来越多,用例采用excel文档进行记录,每个sheet代表一级功能模块,每个sheet里面会有多个二级功能模块。由于功能模块较多,导致测试用例文档中存在几十个sheet页2、由于项目测试中,很多测试用例可以共用一条测试用例,为了减......
  • Python wordpress-xmlrpc错误:xml.parsers.expat.ExpatError: XML or text declaration
    解决方法:修改打开client.py文件原代码:deffeed(self,data):self._parser.Parse(data,0)改成如下的代码:deffeed(self,data):self._parser.Parse(data.strip(),0)......
  • Python neopixel package bugs All In One
    PythonneopixelpackagebugsAllInOnePython3Pythonneopixellibrarydocshttps://docs.circuitpython.org/projects/neopixel/en/latest/index.htmlhttps://github.com/adafruit/Adafruit_CircuitPython_NeoPixelbugs❌https://github.com/adafruit/Adafruit......
  • python入门
    引入我们学习python语言是为了控制计算机、让计算机能够像人一样去工作,所以在python这门语言中,所有语法存在的意义都是为了让计算机具备人的某一项技能,这句话是我们理解后续所有python语法的根本。变量什么是变量#变量就是可以变化的量,量指的是事物的状态,比如人的年龄、性别,......
  • python实现计算器
    python两行代码实现计算器python是一门强大的语言,有时候解决一些问题用python会特别简单,python总会有一些独特的解法,让人出乎意料,还记得初学C语言的时候,一本书上讲解了一个计算器的实现,几十行代码,那时候对于刚刚入坑的我来说几十行代码就已经让我晕头转向了,研究了好久,总算是把它......