You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现低内存高速度的数组唯一元素统计?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:52:30