首页 > 解决方案 > Python列表理解 - 直接返回大列表比存储更快,然后返回

问题描述

我最近正在处理一个问题,该问题需要我浏览一个非常大的文件夹(约 600,000 个文件)并返回与某个标准匹配的文件名列表。原始版本是存储在变量中的普通列表推导。这不是实际的代码,但它提供了要点。

    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 中写下理解避免了第一个版本的问题呢?谢谢!

标签: pythonperformancereturnlist-comprehension

解决方案


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

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


推荐阅读