算法:如何删除所有其他文件

时间:2009-05-14 21:42:18

标签: python algorithm

我有一个包含数千张图片的文件夹。 我想删除所有其他图像。 这样做最有效的方法是什么? 用i%2 == 0遍历每一个仍然是O(n)。 有没有快速的方法(最好用Python)?

THX

8 个答案:

答案 0 :(得分:21)

要删除N个图像的一半,不能比O(N)快!你知道O()符号意味着(除其他事项外)常数乘法因子是不相关的,是吗?

答案 1 :(得分:11)

import os
l = os.listdir('/some/dir/with/files')

for n in l[::2]:
    os.unlink(n)

答案 2 :(得分:3)

  

使用i%2 == 0遍历每个仍然是O(n)。有没有快速的方法(最好用Python)?

比O(n)更快的唯一方法是,如果您的文件已经排序,并且您只想删除1个文件。

你说i%2 == 0,这意味着你要删除每个“偶数”文件。 O(n / 2)仍然是O(n)

答案 3 :(得分:2)

我没有看到删除n/2文件比O(n)更快的任何可想到的方式,除非文件系统具有删除大量文件的一些特殊功能(但我不认为实际上在实践中存在,如果可能的话)

答案 4 :(得分:1)

如果你想删除Log(n)文件,那么......你可以将图像存储在数据库中(MySQL有一种“blob”类型,其中包括存储图像的其他类型)。如果你巧妙地命名它们,你可以在O(1)中完成它。

/编辑 我讨厌如何使用速记和错误的语法来快速得到我的答案!

如果你正在寻找一个等价于rm -rf * 2.img * 4.img * 6.img * 8.img * 0.img的python,知道计算机仍然必须通过整个列表文件

答案 5 :(得分:1)

您可以使用islice模块中的itertools。这是你的榜样:

import os, itertools
dirContent = os.listdir('/some/dir/with/files')
toBeDeleted = itertools.islice(dirContent, 0, len(dirContent), 2)
# Now remove the files
[os.unlink(file) for file in toBeDeleted]

这是做你想做的事的另一种形式,虽然我不确定它是否会更快。希望这会有所帮助。

答案 6 :(得分:0)

“在i%2 = = 0的情况下,每个人仍然是O(n)”

增加2而不是递增1?

for(i = 0; i < numFiles; i += 2) {
  deleteFile(files[i]);
}

严重的是:迭代文件列表可能不是文件删除算法中最慢的部分。实际删除可能需要几个数量级的时间。

答案 7 :(得分:0)

我会尝试使用特定于操作系统的东西:

的Linux:

@files = grep { -f "$dir/$_" && /*.H$/ }
unlink @files

WIN:

$file_delete =~ /H$/;
rm $file_delete

看看你的操作系统是否可以比在python中迭代更快。

使用os.system(...)或subprocess.call(...)从python中运行它们。