Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python迭代脚本随着迭代的进行而减慢_Python - Fatal编程技术网

Python迭代脚本随着迭代的进行而减慢

Python迭代脚本随着迭代的进行而减慢,python,Python,我正在一个项目中使用基因组树序列(参见和)。我的树序列包含大约100万棵树,每个树包含884个样本。总结目标;我连续遍历树并检查函数中的每个样本,为每个树中的每个样本输出一个0-8范围内的整数值。树从一个到下一个连续地变化很小,所以我实际上只查看发生了变化的样本,并且对没有发生变化的样本复制上一个树的结果。 树上的外部循环如下所示: predict=np.zeros((num_trees,num_samples), dtype=int) progress_bar = tqdm.t

我正在一个项目中使用基因组树序列(参见和)。我的树序列包含大约100万棵树,每个树包含884个样本。总结目标;我连续遍历树并检查函数中的每个样本,为每个树中的每个样本输出一个0-8范围内的整数值。树从一个到下一个连续地变化很小,所以我实际上只查看发生了变化的样本,并且对没有发生变化的样本复制上一个树的结果。 树上的外部循环如下所示:

    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棵树的速度下一直有效。

我对此一无所知,但可能与此有关。有什么方法可以产生一个最小的工作示例吗?