python - 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 中写下理解避免了第一个版本的问题呢?谢谢!
解决方案
这两段代码没有区别。一个都没有。他们都在创建一个列表,然后管理对该列表的引用。
您的问题的可能原因是缓存。在第一种情况下,文件系统必须一遍又一遍地访问磁盘以获取更多条目。完成后,该目录位于文件缓存中,可以立即读取。重新启动并重试,您会看到第二个所需的时间相同。
推荐阅读
- python - 汽车车库模拟器 - 生成随机泊松分布
- webpack - Webpack - 在开发和生产中复制文件
- html - 标题和部分相互合并/重叠
- java - 无法删除openjdk debian9.6
- redux - redux saga 等待完成?
- netsuite - SuiteScript API 角色不会显示在集成合作伙伴上
- java - 反射性地创建一个匿名类
- json - 如何在不使用 kafka 的 JsonSerializer 的情况下向 Kafka 生成 JSON 对象
- html - VueJs CLI 导入/编译 html 字符串到 vue
- ms-access - 如何使用 VBA 从输入框中添加日期以填充所选 Access 表中的整个列