微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在列表中找到非零条纹时改善运行时

如何解决在列表中找到非零条纹时改善运行时

我编写了一个函数,该函数接受一个整数列表和一个值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 举报,一经查实,本站将立刻删除。