MST

星途 面试题库

面试题:Python在海量列表遍历中的性能优化及内存管理策略

假设你需要处理一个包含数百万个字典的列表,每个字典有多个键值对,例如[{'name': 'Alice', 'age': 25, 'score': 85}, {'name': 'Bob', 'age': 30, 'score': 78}, ...]。现在要遍历这个海量列表,找出年龄大于40且分数大于90的人员信息,并将这些信息存储到新的列表中。请详细阐述在Python中实现此功能的高效遍历策略,包括如何优化内存使用,避免内存溢出,以及如何通过并行处理或其他高级技术进一步提升性能。
30.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

1. 常规遍历方法

data = [{'name': 'Alice', 'age': 25,'score': 85}, {'name': 'Bob', 'age': 30,'score': 78}]
result = []
for item in data:
    if item['age'] > 40 and item['score'] > 90:
        result.append(item)

2. 优化内存使用 - 生成器表达式

使用生成器表达式可以避免一次性将所有符合条件的字典存储在内存中,而是按需生成。

data = [{'name': 'Alice', 'age': 25,'score': 85}, {'name': 'Bob', 'age': 30,'score': 78}]
generator_result = (item for item in data if item['age'] > 40 and item['score'] > 90)
# 如果确实需要列表形式,再进行转换
result_list = list(generator_result)

3. 并行处理 - multiprocessing模块

利用multiprocessing模块将数据分块处理,然后合并结果。

import multiprocessing


def filter_data_chunk(chunk):
    return [item for item in chunk if item['age'] > 40 and item['score'] > 90]


if __name__ == '__main__':
    data = [{'name': 'Alice', 'age': 25,'score': 85}, {'name': 'Bob', 'age': 30,'score': 78}]
    num_processes = multiprocessing.cpu_count()
    chunk_size = len(data) // num_processes
    chunks = [data[i:i + chunk_size] for i in range(0, len(data), chunk_size)]

    pool = multiprocessing.Pool(processes=num_processes)
    results = pool.map(filter_data_chunk, chunks)
    pool.close()
    pool.join()

    final_result = [item for sublist in results for item in sublist]

4. 其他优化

  • 使用numba:如果数据结构和处理逻辑允许,可以使用numba对Python函数进行JIT编译,提升处理速度。但numba对字典操作的支持有限,可能需要对数据结构进行一定的转换。
  • 使用pandas:如果数据可以整理成表格形式,pandas提供了高效的矢量化操作,可以快速处理大规模数据。例如:
import pandas as pd

data = [{'name': 'Alice', 'age': 25,'score': 85}, {'name': 'Bob', 'age': 30,'score': 78}]
df = pd.DataFrame(data)
result = df[(df['age'] > 40) & (df['score'] > 90)].to_dict('records')