问题描述
我希望编写一个函数,该函数可以查找给定目录并为我提供特定名称的所有文件夹的路径列表。
假设我需要在桌面及其所有子目录中搜索名为“测试”的文件夹。原始代码是这样的:
def finder():
lst = []
for root,dir,files in os.walk(r'C:\Users\username\Desktop'):
for i in dir:
if i == 'Test':
lst.append(os.path.join(root,i))
return lst
我在网上看了一下,发现列表推导在这种情况下可以更快,并提出了以下功能:
def finder2():
lst = [i[0] for i in os.walk(r'C:\Users\username\Desktop') if i[0][-4:]=='Test']
return lst
我使用timeit对这两个函数进行了100次重复计时,发现它们花费的时间相似。
- 为什么列表理解速度不快?
- 如何使其更快?
- 还有其他更快的方法来做同样的事情吗?
谢谢!
解决方法
该任务可能主要受I / O限制,因此无论执行多少速度,您都不太可能实现很大的加速。
列表推导仍然是Python级别的有效循环,并且可能比for
循环稍微更快,因为append
属性不需要每次都查找时间,但是通常差异并不大。
为了进行更彻底的比较,在Linux系统上,我将Python代码的时序与等效的find
命令(find /starting/directory -type d -name Test
)进行了比较。在这里,find
是用C代码编译的可执行文件,因此对于CPU受限的任务,预计将比Python中的任何显式循环(包括列表推导)都快得多。实际上,我发现运行find
仅比Python代码平均快25%。这表明任务受I / O限制,并且您不太可能通过更改算法来实现显着的加速。