MST

星途 面试题库

面试题:Python列表推导式与生成器表达式的深度对比及应用

假设你有一个非常大的文件,文件中每行包含一个数字。现在需要对这些数字进行一系列复杂计算(例如先平方,再判断是否大于100,然后取平方根),最后得到满足条件的数字列表。请分别使用列表推导式和生成器表达式来实现,并详细阐述在这种大数据场景下,二者在内存使用、执行效率等方面的差异,以及各自适用的场景。
19.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

列表推导式实现

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)

二者差异

  1. 内存使用
    • 列表推导式:会一次性将所有满足条件的结果生成并存储在内存中。如果文件非常大,可能会导致内存不足,因为整个列表会占用大量内存空间。
    • 生成器表达式:不会一次性生成所有结果,而是按需生成。每次迭代时才生成一个结果,因此内存占用较小,更适合处理大数据场景。
  2. 执行效率
    • 列表推导式:由于要一次性生成所有结果,在生成过程中可能会花费较长时间,尤其是数据量很大时。但是如果后续需要多次遍历结果,列表由于已经在内存中,访问速度会比较快。
    • 生成器表达式:按需生成结果,在生成单个结果时速度可能较快,因为不需要等待所有结果生成完毕。但如果需要多次遍历结果,每次都需要重新生成,可能会导致性能下降。

适用场景

  1. 列表推导式:适用于数据量较小,并且需要多次快速访问结果的场景。例如,对一个小数据集进行处理后,需要在不同地方多次使用处理后的完整列表。
  2. 生成器表达式:适用于数据量极大,内存资源有限,并且只需对结果进行一次遍历的场景。例如,处理超大文件,只需对满足条件的结果进行一次汇总统计等操作。