列表推导式实现
with open('large_file.txt') as f:
numbers = [int(line.strip()) for line in f]
result_list = [int((num ** 2) ** 0.5) for num in numbers if (num ** 2) > 100]
生成器表达式实现
with open('large_file.txt') as f:
numbers = (int(line.strip()) for line in f)
result_generator = (int((num ** 2) ** 0.5) for num in numbers if (num ** 2) > 100)
二者差异
- 内存使用:
- 列表推导式:会一次性将所有满足条件的结果生成并存储在内存中。如果文件非常大,可能会导致内存不足,因为整个列表会占用大量内存空间。
- 生成器表达式:不会一次性生成所有结果,而是按需生成。每次迭代时才生成一个结果,因此内存占用较小,更适合处理大数据场景。
- 执行效率:
- 列表推导式:由于要一次性生成所有结果,在生成过程中可能会花费较长时间,尤其是数据量很大时。但是如果后续需要多次遍历结果,列表由于已经在内存中,访问速度会比较快。
- 生成器表达式:按需生成结果,在生成单个结果时速度可能较快,因为不需要等待所有结果生成完毕。但如果需要多次遍历结果,每次都需要重新生成,可能会导致性能下降。
适用场景
- 列表推导式:适用于数据量较小,并且需要多次快速访问结果的场景。例如,对一个小数据集进行处理后,需要在不同地方多次使用处理后的完整列表。
- 生成器表达式:适用于数据量极大,内存资源有限,并且只需对结果进行一次遍历的场景。例如,处理超大文件,只需对满足条件的结果进行一次汇总统计等操作。