- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在努力让自己在 python 方面变得更好。有一些工具可以做这些事情,但我想自己做有两个原因。
我有两个文本文件,大小完全相同,行数也相同。我需要检查文本的第 2、6(每次 +4)行,查看它的开头文本,检查它是否与某些预定义文本相似,如果是,则将该行与相应文件中的 4 block 一起写入,并写入相同的内容另一个相应文件中的行。 (对于那些听起来很熟悉的人,我正在尝试从 Illumina 配对的末端序列数据中分离条形码数据)。
我已经有一个工作代码,但问题是它需要几天才能完成。 100,000 行我花了大约 10 分钟,我有 2 亿行。
我把代码和我的想法一起贴在这里。好的,我有 100 个键,它们是 ATCCGG、ACCTGG 等。但是,如果我有一个不匹配,我想认为它是正确的,例如 DOG 可以有 AOG、BOG、DIG、DAG、DOF、DOH....
def makehamming2(text,dist):
dicthamming=dict()
rep=["A","T","C","G"]
if dist==1:
for i in range(len(text)):
for j in range(len(rep)):
chars=list(text)
if rep[j]<>chars[i]:
chars[i]=rep[j]
word="".join(chars)
dicthamming[word]=text
return dicthamming
我正在使用 dist=1。
我将此函数用于 100 个条形码,因此,我的字典中大约有 ~100*18 个项目。
count=0
eachline=1
writeflag=0
seqlen=int(seqlen)
cutlen=len(cutsite)
infile=open(inf, "r")
for line in infile:
count+=1
if eachline==1:
writeflag=0
header=line
eachline=2
elif eachline==2:
eachline=3
line=line.strip()
if line[0:6] in searchdict.keys():
barcode=searchdict[line[0:6]]
towritefile=outfile+"/"+barcode+".fastq"
seq=line[6:seqlen+6]
qualstart=6
writeflag=1
seqeach[barcode]=seqeach.get(barcode,0)+1
elif eachline==3:
eachline=4
third=line
elif eachline==4:
eachline=1
line=line.strip()
if writeflag==1:
qualline=line[qualstart:qualstart+seqlen]
addToBuffer=header+seq+"\n"+third+qualline+"\n"
bufferdict[towritefile]=bufferdict.get(towritefile,"")+addToBuffer
Fourlinesofpair=getfrompair(inf2,count, seqlen)
bufferdictpair[towritefile[:-6:]+"_2.fastq"]=\
bufferdictpair.get(towritefile[:-6:]+"_2.fastq","")+Fourlinesofpair
if (count/4)%10000==0:
print "writing" , str((count/4))
for key, val in bufferdict.items():
writefile1=open(key,"a")
writefile1.write(val)
bufferdict=dict()
for key, val in bufferdictpair.items():
writefile1=open(key,"a")
writefile1.write(val)
bufferdictpair=dict()
end=(time.time()-start)/60.0
print "finished writing", str(end) , "minutes"
print "writing" , str(count/4)
for key, val in bufferdict.items():
writefile1=open(key,"a")
writefile1.write(val)
bufferdict=dict()
writefile1.close()
for key, val in bufferdictpair.items():
writefile1=open(key,"a")
writefile1.write(val)
bufferdictpair=dict()
writefile1.close()
end=(time.time()-start)/60.0
print "finished writing", str(end) , "minutes"
getfrompair 是一个函数,
def getfrompair(inf2, linenum, length):
info=open(inf2,"r")
content=""
for count, line in enumerate(info):
#print str(count)
if count == linenum-4:
content=line
if count == linenum-3:
content=content+line.strip()[:length]+"\n"
if count == linenum-2:
content=content+line
if count == linenum-1:
content=content+line.strip()[:length]+"\n"
#print str(count), content
return content
所以,我的主要问题是如何优化它。在大多数情况下,我会假设此代码在至少 8GB 内存和 >4 核处理器中运行。我可以使用多处理器吗?我在这里的另一个线程中使用了建议的缓冲区,因为这比在每行之后写入磁盘更快。
预先感谢您对我的教导。
编辑 1根据 Ignacio 的建议,我进行了分析,“getfrompair”函数占用了一半以上的运行时间?有没有更好的方法从文件中获取特定行而无需在某个时间逐行检查。
剖析结果来自分数(10000 行,而不是原始的 8 亿行)
68719 function calls in 2.902 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
66 0.000 0.000 0.000 0.000 :0(append)
32 0.003 0.000 0.003 0.000 :0(close)
2199 0.007 0.000 0.007 0.000 :0(get)
8 0.002 0.000 0.002 0.000 :0(items)
3 0.000 0.000 0.000 0.000 :0(iteritems)
750 0.001 0.000 0.001 0.000 :0(join)
7193 0.349 0.000 0.349 0.000 :0(keys)
39977 0.028 0.000 0.028 0.000 :0(len)
1 0.000 0.000 0.000 0.000 :0(mkdir)
767 0.045 0.000 0.045 0.000 :0(open)
300 0.000 0.000 0.000 0.000 :0(range)
1 0.005 0.005 0.005 0.005 :0(setprofile)
96 0.000 0.000 0.000 0.000 :0(split)
1 0.000 0.000 0.000 0.000 :0(startswith)
1 0.000 0.000 0.000 0.000 :0(stat)
6562 0.016 0.000 0.016 0.000 :0(strip)
4 0.000 0.000 0.000 0.000 :0(time)
48 0.000 0.000 0.000 0.000 :0(update)
46 0.004 0.000 0.004 0.000 :0(write)
733 1.735 0.002 1.776 0.002 RC14100~.PY:273(getfrompair)
1 0.653 0.653 2.889 2.889 RC14100~.PY:31(split)
1 0.000 0.000 0.000 0.000 RC14100~.PY:313(makehamming)
1 0.000 0.000 0.005 0.005 RC14100~.PY:329(processbc2)
48 0.003 0.000 0.005 0.000 RC14100~.PY:344(makehamming2)
1 0.006 0.006 2.896 2.896 RC14100~.PY:4(<module>)
4553 0.015 0.000 0.025 0.000 RC14100~.PY:74(<genexpr>)
2659 0.014 0.000 0.023 0.000 RC14100~.PY:75(<genexpr>)
2659 0.013 0.000 0.023 0.000 RC14100~.PY:76(<genexpr>)
1 0.001 0.001 2.890 2.890 RC14100~.PY:8(main)
1 0.000 0.000 0.000 0.000 cProfile.py:5(<module>)
1 0.000 0.000 0.000 0.000 cProfile.py:66(Profile)
1 0.000 0.000 0.000 0.000 genericpath.py:15(exists)
1 0.000 0.000 0.000 0.000 ntpath.py:122(splitdrive)
1 0.000 0.000 0.000 0.000 ntpath.py:164(split)
1 0.000 0.000 0.000 0.000 os.py:136(makedirs)
1 0.000 0.000 2.902 2.902 profile:0(<code object <module> at 000000000211A9B0, file "RC14100~.PY", line 4>)
0 0.000 0.000 profile:0(profiler)
Process "Profile" terminated, ExitCode: 00000000
最佳答案
您的 getfrompair
函数使这成为一个经典的 O(n^2) 问题,因为您每次获得匹配项时都会通读第二个文件。相反,您想做的是同时从两个文件中读取,这样您只需要浏览一次。 izip
是做到这一点的方法。
from itertools import izip
for line,line2 in izip(infile, infile2):
关于python - 大文本文件和另一个文本文件中相应行的条形码分割(python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12586734/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!