如何实现低内存高速度的数组唯一元素统计?Python优化求助
优化Python去重计数的内存与效率方案
你的老师说得很对——原代码用列表存储所有输入元素的方式,确实在时间和内存效率上都有很大提升空间。咱们一步步拆解问题,看看怎么优化:
先说说原代码的问题
- 时间效率低:每次判断
tel in a都是遍历整个列表的线性查找,当输入量N很大时,这个操作会越来越慢,整体时间复杂度达到O(N²)。 - 内存浪费:列表
a会存储每一个输入的号码,哪怕是重复的,内存占用会随着输入量线性增长。
最优优化方案:用集合替代列表
Python的set(集合)是专门为存储唯一元素设计的,底层用哈希表实现,完美契合你的需求:
- 查找元素是否存在的时间复杂度是O(1),比列表快得多;
- 只会存储唯一元素,不会浪费内存存重复项。
改写后的代码可以是这样:
n = int(input()) seen_numbers = set() unique_count = 0 for _ in range(n): current_tel = int(input()) if current_tel not in seen_numbers: seen_numbers.add(current_tel) unique_count += 1 print(unique_count)
如果想更简洁,甚至可以省掉unique_count变量,直接利用集合的长度:
n = int(input()) seen_numbers = set() for _ in range(n): seen_numbers.add(int(input())) print(len(seen_numbers))
set.add()方法会自动忽略已经存在的元素,最后集合的长度就是唯一号码的数量,代码更清爽,效率也完全一致。
关于“可被持续覆写的变量”的理解
你老师提到的“可被持续覆写的变量”,应该是指不要用列表这种会持续累积所有输入的结构,而是用集合这种只维护必要数据(唯一元素)的结构——它不需要存储所有输入,只需要记录哪些号码已经出现过,本质上是用更高效的方式更新已记录的内容,而不是无脑堆积所有数据。
极端场景的极致内存优化
如果你的输入量大到夸张(比如百万级甚至千万级),连存储所有唯一号码都觉得内存紧张,可以考虑用位集合(需要安装bitarray库),但这只适用于号码范围明确的场景;一般情况下,用集合就已经能兼顾速度和内存效率了。
内容的提问来源于stack exchange,提问作者Egor
相关产品推荐
相关产品推荐

