Python迭代脚本随着迭代的进行而减慢
我正在一个项目中使用基因组树序列(参见和)。我的树序列包含大约100万棵树,每个树包含884个样本。总结目标;我连续遍历树并检查函数中的每个样本,为每个树中的每个样本输出一个0-8范围内的整数值。树从一个到下一个连续地变化很小,所以我实际上只查看发生了变化的样本,并且对没有发生变化的样本复制上一个树的结果。 树上的外部循环如下所示:Python迭代脚本随着迭代的进行而减慢,python,Python,我正在一个项目中使用基因组树序列(参见和)。我的树序列包含大约100万棵树,每个树包含884个样本。总结目标;我连续遍历树并检查函数中的每个样本,为每个树中的每个样本输出一个0-8范围内的整数值。树从一个到下一个连续地变化很小,所以我实际上只查看发生了变化的样本,并且对没有发生变化的样本复制上一个树的结果。 树上的外部循环如下所示: predict=np.zeros((num_trees,num_samples), dtype=int) progress_bar = tqdm.t
predict=np.zeros((num_trees,num_samples), dtype=int)
progress_bar = tqdm.tqdm(total=num_trees)
results_prev=np.zeros((num_samples,(9*4)))
index=0
for diff in tree_sequence.edge_diffs():
tree=ts.at_index(index)
results = sam_sites(diff[2],tree, results_prev)
predict[index,:]=results
results_prev=results
del results
progress_bar.update()
index+=1
progress_bar.close()
def sam_sites(diff, tree, results_prev):
nodes={diff[i].child for i in range(len(diff))}
samples_changed={leaf for node in nodes for leaf in tree.leaves(node)}
results_new=results_prev
results_new[np.array(list(samples_changed)),:]=0
for sam in sams_new:
"Extract a integer value for each of samples_changed and replace 0 in results_new array"
return results_new
sam_sites功能如下所示:
predict=np.zeros((num_trees,num_samples), dtype=int)
progress_bar = tqdm.tqdm(total=num_trees)
results_prev=np.zeros((num_samples,(9*4)))
index=0
for diff in tree_sequence.edge_diffs():
tree=ts.at_index(index)
results = sam_sites(diff[2],tree, results_prev)
predict[index,:]=results
results_prev=results
del results
progress_bar.update()
index+=1
progress_bar.close()
def sam_sites(diff, tree, results_prev):
nodes={diff[i].child for i in range(len(diff))}
samples_changed={leaf for node in nodes for leaf in tree.leaves(node)}
results_new=results_prev
results_new[np.array(list(samples_changed)),:]=0
for sam in sams_new:
"Extract a integer value for each of samples_changed and replace 0 in results_new array"
return results_new
当我第一次运行代码时,它运行得非常快,每秒处理大约40棵树。但是随着迭代的继续,每秒处理的树的数量会减少。我有一个脚本运行了24小时,处理速度下降到每秒2棵树
从其他搜索中,我认为这可能是内存问题?也许在每次迭代时添加到predict numpy数组会增加使用的内存并降低脚本的速度?解决了这个问题!由于某种原因,这条线
tree=ts.at_index(index)
在每次迭代中提取正确的树是导致速度减慢的原因。我将其替换为.next()函数。代码现在是:
predict=np.zeros((num_trees,num_samples), dtype=int)
progress_bar = tqdm.tqdm(total=num_trees)
results_prev=np.zeros((num_samples,(9*4)))
tree = tskit.Tree(ts)
index=0
for diff in tree_sequence.edge_diffs():
tree.next()
results = sam_sites(diff[2],tree, results_prev)
predict[index,:]=results
results_prev=results
del results
index+=1
progress_bar.update()
progress_bar.close()
这在每秒30棵树的速度下一直有效。我对此一无所知,但可能与此有关。有什么方法可以产生一个最小的工作示例吗?