如何加速多个嵌套循环

How to speed up several nested loops

我嵌套了 for 循环,这导致我的操作执行速度非常慢。我想知道是否有其他方法可以做到这一点。

操作基本上是遍历6个不同目录中的文件,并在打开每个文件然后显示它们之前查看每个目录中是否有相同的文件。

我的代码是:

original_images = os.listdir(original_folder)
ground_truth_images = os.listdir(ground_truth_folder)
randomforest_images = os.listdir(randomforest)
ilastik_images = os.listdir(ilastik)
kmeans_images = os.listdir(kmeans)
logreg_multi_images = os.listdir(logreg_multi)
random_forest_multi_images = os.listdir(randomforest_multi)


for x in original_images:
  for y in ground_truth_images:
    for z in randomforest_images:
      for i in ilastik_images:
        for j in kmeans_images:
          for t in logreg_multi_images:
            for w in random_forest_multi_images:
              if x == y == z == i == j == w == t:
                   *** rest of code operation ***


如果条件是同一个文件必须出现在所有七个目录到运行其余的代码操作,那么就没有必要搜索所有目录中的相同文件。一旦该文件不在其中一个目录中,您就可以忘记它并移至下一个文件。因此,您可以构建一个 for 循环,遍历第一个目录中的文件,然后构建一个嵌套的 if 语句链: 如果该文件存在于下一个目录中,则前进到该目录之后的目录并在那里搜索。如果没有,则返回第一个目录并选择其中的下一个文件。

将它们全部转换为集合并遍历最后一个,检查所有其他集合的成员资格:

original_images = os.listdir(original_folder)
ground_truth_images = os.listdir(ground_truth_folder)
randomforest_images = os.listdir(randomforest)
ilastik_images = os.listdir(ilastik)
kmeans_images = os.listdir(kmeans)
logreg_multi_images = os.listdir(logreg_multi)

files = set()

# add folder contents to the set of all files here
for folder in [original_images, ground_truth_images, randomforest_images, ilastik_images, kmeans_images, logreg_multi_images]:
    files.update(folder)

random_forest_multi_images = set(os.listdir(randomforest_multi))

# find all common items between the sets
for file in random_forest_multi_images.intersection(files):
    # rest of code

这样做的原因是您只对所有集合的交集感兴趣,因此您只需要迭代一个集合并检查其余集合中的成员

您应该在进入嵌套循环之前检查 x == y。然后 y == z 等等。现在你太频繁地遍历每个循环了。

还有一个方法:

您可以创建一组所有图像,并在每组图像上创建一个交集,这样唯一剩下的元素就是相等的元素。如果您确定文件相同,则可以跳过该步骤。

如果 x 在所有其他列表中,您可以随时创建路径:

import pathlib
original_images = os.listdir(original_folder)
ground_truth_images = pathlib.Path(ground_truth_folder) #this is a folder
randomforest_images = pathlib.Path(randomforest)

for x in original_images:
    y = ground_truth_images / x
    i = randomforest_images / x
    # And so on for all your files

    # check if all files exist:
    for file in [x, y, i, j, t ,w]:
        if not file.exists():
            continue # go to next x
    # REST OF YOUR CODE USING x, y, i, j, t, w,
    # y, i, j, t, w, are now pathlib object, you can get s string (of its path using str(y), str(i) etc.