我有一个包含数千张图片的文件夹。 我想删除所有其他图像。 这样做最有效的方法是什么? 用i%2 == 0遍历每一个仍然是O(n)。 有没有快速的方法(最好用Python)?
THX
答案 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中运行它们。