Nup*_*pur 4 python generator-expression
我正在使用Python来解析一个大文件.我想做的是
If condition =True
append to list A
else
append to list B
Run Code Online (Sandbox Code Playgroud)
我想为此使用生成器表达式 - 以节省内存.我正在加入实际的代码.
def is_low_qual(read):
lowqual_bp=(bq for bq in phred_quals(read) if bq < qual_threshold)
if iter_length(lowqual_bp) > num_allowed:
return True
else:
return False
lowqual=(read for read in SeqIO.parse(r_file,"fastq") if is_low_qual(read)==True)
highqual=(read for read in SeqIO.parse(r_file,"fastq") if is_low_qual(read)==False)
SeqIO.write(highqual,flt_out_handle,"fastq")
SeqIO.write(lowqual,junk_out_handle,"fastq")
def iter_length(the_gen):
return sum(1 for i in the_gen)
Run Code Online (Sandbox Code Playgroud)
您可以使用itertools.tee
会同itertools.ifilter
和itertools.ifilterfalse
:
import itertools
def is_condition_true(x):
...
gen1, gen2 = itertools.tee(sequences)
low = itertools.ifilter(is_condition_true, gen1)
high = itertools.ifilterfalse(is_condition_true, gen2)
Run Code Online (Sandbox Code Playgroud)
tee
即使序列本身是生成器,使用也可确保函数正常工作.
但是请注意,如果并且以不同的速率消耗(例如,如果在使用之前已经耗尽),那么tee
它本身可以使用相当大的内存(直到大小列表).len(sequences)
low
high
low
high