优化 returns python 中文件夹路径的功能
Optimizing a function that returns paths of a folder in python
我想编写一个函数来查看给定目录并为我提供具有特定名称的所有文件夹的路径列表。
假设我需要在桌面及其所有子目录中搜索名为“Test”的文件夹。原来的代码是这样的:
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 有限的,因此您不太可能 speed-up 完成任何任务。
列表推导在 Python 级别仍然是有效的循环,并且可能比 for
循环快 稍微 因为 append
属性不需要每次都查,但是一般差别不是很大。
为了进行更彻底的比较,在 Linux 系统上,我将您的 Python 代码的时间与等效的 find
命令 (find /starting/directory -type d -name Test
) 进行了比较。在这里,find
是一个从 C 代码编译的可执行文件,因此对于 CPU 有限的任务预计会比 Python 中的任何显式循环(包括列表推导)快得多。事实上,我发现 运行 find
平均只比 Python 代码快 25%。这表明该任务 I/O 有限,您不太可能通过更改算法实现重要 speed-up。
我想编写一个函数来查看给定目录并为我提供具有特定名称的所有文件夹的路径列表。
假设我需要在桌面及其所有子目录中搜索名为“Test”的文件夹。原来的代码是这样的:
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 有限的,因此您不太可能 speed-up 完成任何任务。
列表推导在 Python 级别仍然是有效的循环,并且可能比 for
循环快 稍微 因为 append
属性不需要每次都查,但是一般差别不是很大。
为了进行更彻底的比较,在 Linux 系统上,我将您的 Python 代码的时间与等效的 find
命令 (find /starting/directory -type d -name Test
) 进行了比较。在这里,find
是一个从 C 代码编译的可执行文件,因此对于 CPU 有限的任务预计会比 Python 中的任何显式循环(包括列表推导)快得多。事实上,我发现 运行 find
平均只比 Python 代码快 25%。这表明该任务 I/O 有限,您不太可能通过更改算法实现重要 speed-up。