如何优化.mcool文件染色体重命名代码中的冗余嵌套循环?
优化mcool文件染色体名称前缀添加代码
需求说明
针对所有.mcool文件,处理每个分辨率对应的cooler对象:若染色体名称不以"chr"前缀开头,需生成映射字典trans = {chrom: f"chr{chrom}" for chrom in clr.chromnames},再调用cooler.rename_chroms(clr, trans)为符合条件的染色体添加"chr"前缀。
问题分析
原代码存在冗余操作:遍历每个需要添加前缀的染色体时,重复生成完整的映射字典,且多次调用rename_chroms方法,这会导致不必要的计算开销,降低处理效率。
原代码
pathlist = Path(data_dir).glob('**/*.mcool') for path in pathlist: cool_file = str(path) filename = cool_file.split("/",1)[1] resolution = [i.rsplit("/", 1)[1] for i in cooler.fileops.list_coolers(cool_file)] ### load a cooler for each resolution for j in resolution: clr = cooler.Cooler(f'{cool_file}::resolutions/{j}') for chrom in (chrom for chrom in clr.chromnames if not chrom.startswith("chr")): trans = {chrom: f"chr{chrom}" for chrom in clr.chromnames} cooler.rename_chroms(clr, trans) print(f'chromosomes: {clr.chromnames}, binsize: {clr.binsize}')
优化后代码
pathlist = Path(data_dir).glob('**/*.mcool') for path in pathlist: cool_file = str(path) filename = cool_file.split("/",1)[1] resolution = [i.rsplit("/", 1)[1] for i in cooler.fileops.list_coolers(cool_file)] ### load a cooler for each resolution for j in resolution: clr = cooler.Cooler(f'{cool_file}::resolutions/{j}') # 一次性生成完整映射字典,仅为无chr前缀的染色体添加前缀 trans = {chrom: f"chr{chrom}" if not chrom.startswith("chr") else chrom for chrom in clr.chromnames} # 检查是否有需要修改的染色体,避免无意义调用 if any(not chrom.startswith("chr") for chrom in clr.chromnames): cooler.rename_chroms(clr, trans) print(f'chromosomes: {clr.chromnames}, binsize: {clr.binsize}')
优化点说明
- 一次性生成完整的映射字典,无需在循环中重复创建
- 先判断是否存在需要修改的染色体,避免对已经符合要求的cooler对象执行无意义的
rename_chroms调用 - 移除冗余的嵌套循环,将逻辑简化为一次映射+一次方法调用,大幅提升处理效率
输入输出示例
输入(clr.chromnames)
['M', 'chr1', '2', '3', 'chr4'] ['7', '8', 'chr9', '10', '11', 'chr12'] ['X', 'chrY', 'chr1', '2', '4']
预期输出(clr.chromnames)
['chrM', 'chr1', 'chr2', 'chr3', 'chr4'] ['chr7', 'chr8', 'chr9', 'chr10', 'chr11', 'chr12'] ['chrX', 'chrY', 'chr1', 'chr2', 'chr4']
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

