MST

星途 面试题库

面试题:Python字符串性能优化的高级处理

给定一个非常大的文本文件(假设文件大小为1GB,每行是一个字符串),其中包含大量的重复字符串,要求编写一个Python程序,使用内存优化的方式统计每个字符串出现的次数,并按出现次数从高到低排序输出。说明你采用的算法和数据结构,并解释如何避免内存溢出问题。
25.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import collections
import sys


def count_and_sort_strings(file_path):
    # 使用生成器逐行读取文件,避免一次性加载整个文件到内存
    def read_lines():
        with open(file_path, 'r', encoding='utf-8') as file:
            for line in file:
                yield line.strip()


    counter = collections.Counter(read_lines())
    sorted_counter = sorted(counter.items(), key=lambda item: item[1], reverse=True)
    for string, count in sorted_counter:
        print(f"{string}: {count}")


if __name__ == "__main__":
    if len(sys.argv)!= 2:
        print("Usage: python script.py <file_path>")
    else:
        count_and_sort_strings(sys.argv[1])

算法和数据结构说明

  1. 生成器(Generator):通过自定义的read_lines生成器函数逐行读取文件,而不是一次性将整个1GB文件读入内存,这样可以大大减少内存占用。每次迭代时,只在内存中保留当前行的字符串。
  2. collections.Counter:使用Counter来统计每个字符串出现的次数。Counter是一个字典的子类,非常适合这种计数场景,它会自动维护每个元素的计数。
  3. 排序:使用Python内置的sorted函数,对Counter对象转换后的列表进行排序。排序依据是每个字符串的出现次数,并且设置reverse=True以实现从高到低排序。

避免内存溢出问题的方式

  1. 逐行读取:通过生成器逐行读取文件,而不是一次性将整个文件读入内存。这样在任何时刻,内存中只有当前正在处理的一行数据,即使文件非常大也不会造成内存溢出。
  2. Counter的高效性collections.Counter内部实现针对计数场景进行了优化,它不会占用过多的额外内存。每个字符串及其计数在Counter对象中以键值对的形式存储,相比于手动实现计数逻辑,Counter更节省内存和代码量。