如何解决在列表中找到非零条纹时改善运行时
我编写了一个函数,该函数接受一个整数列表和一个值l。返回值是一个元组-第一个元素是包含非零的整数条纹(必须为长度l或更长)的计数,第二个元素为这些条纹的平均长度。我将此功能用于生物信息学项目,这将要求我输入包含数百万个整数的列表。我发现我写的方法太慢了。如何提高程序效率?
def contigs_values(sequenced_lst,l):
"""
By splitting at zeros,can count contiguous sequenced sequences
"""
# a list of lists storing index start and end values of each contig
contig_indices = []
start = 0
end = 1
while end != len(sequenced_lst):
if 0 not in sequenced_lst[start:end + 1]: # only extend window if contiguous
end += 1 # extend contig window
# continue
if end == len(sequenced_lst):
contig_indices.append([start,end]) # append final contig indices as index list
else: # zero is found and contig broken
if end - start > 1:
if end - start < l: # debug test... Todo: no window should be less than R length,L
print("MISTAKE")
contig_indices.append([start,end]) # append contig indices as index list
start = end # start a new contig window
end += 1
num_contigs = len(contig_indices)
avg_contig_len = get_average([i[1] - i[0] for i in contig_indices])
return num_contigs,avg_contig_len
解决方法
如果我正确地理解了目标,那么代码运行缓慢的原因是,您不断检查列表的长度,因此在O(n ^ 2)附近的某个地方
因此,不用计算列表的长度,而是查找当前0和先前0之间的差。
使用枚举相对容易:
def contigs_values(sequenced_lst,l):
"""
By splitting at zeros,can count contiguous sequenced sequences
"""
streaks = []
prev = 0
for index,val in enumerate(sequenced_lst):
if val == 0:
length = index - prev - 1
if length >= l:
streaks.append(length)
prev = index
else:
if index - prev >= l:
streaks.append(index - prev)
num_contigs = len(streaks)
avg_contig_len = sum(streaks)/num_contigs
return num_contigs,avg_contig_len
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。