Python 列表理解 - 直接返回大列表比先存储再返回更快

Python list comprehension - Directly returning large list is faster than storing, then returning

我最近在处理一个问题,它要求我检查一个非常大的文件夹(约 600,000 个文件)和 return 符合特定条件的文件名列表。原始版本是存储在变量中的普通列表理解。这不是实际代码,但它给出了要点。

    def filter_files(file_path):
      filtered = [f.path for f in os.scandir(file_path) if f.path.endswith('.png')]
      return filtered

当监控这个时,它会开始很快,然后逐渐变慢。我想是因为它只是想在变量中存储这么多数据。

然后我将其重写为:

    def filter_files(file_path):
      return [f.path for f in os.scandir(file_path) if f.path.endswith('.png')]

并这样称呼它:

    def test(file_path):
      filtered = filter_files(file_path)

这个永远不会放慢速度。它始终保持相同的速度。

我的问题是,到底是什么导致了这种差异?数据仍存储在一个变量中,并且仍在作为列表理解进行处理。在 return 中编写理解如何避免第一个版本的问题?谢谢!

这两段代码没有区别。 None 完全没有。他们都在创建一个列表,然后管理对该列表的引用。

您的问题的可能原因是缓存。在第一种情况下,文件系统必须一遍又一遍地不断访问磁盘以获取更多条目。完成后,该目录位于文件缓存中,可以立即读取。重新启动并重试,您会看到第二个花费的时间相同。