python - 从列表中删除重复项(算法速度)
问题描述
我目前正在阅读如何像计算机科学家一样思考并完成那里的练习。列表算法部分中有一个函数(remove_adjacent_dups),我认为我可以改进。
原始功能:
def remove_adjacent_dups(xs):
""" Return a new list in which all adjacent
duplicates from xs have been removed.
"""
result = []
most_recent_elem = None
for e in xs:
if e != most_recent_elem:
result.append(e)
most_recent_elem = e
return result
我的功能:
def remove_duplicates(xs):
"""Removes duplicate elements from given list ”xs” """
result = []
for e in xs:
if e not in xs:
result.append(e)
return result
remove_adjacent_dups仅适用于排序列表,因此涉及额外的操作。remove_duplicates不关心序列是否已排序,无论如何它都会删除所有重复项。但问题是,如果我将我的函数应用到书中的练习中,它会慢得多:
删除重复项:
全书共27336字。只有 2569 个是唯一的。
这花了 0.2556 秒。
remove_adjacent_dups:
全书共27336字。只有 2569 个是唯一的。
这花了 0.0132 秒。(本次包括分拣操作)
任何人都知道为什么remove_adjacent_dups更有效,即使它涉及额外的排序操作并且它还有一个额外的变量most_recent_elem?
解决方案
一个额外的变量不会像你想象的那么慢。
其实关键就在这里:
if e not in results:
如果结果是True
,这将非常耗时,因为整个列表被迭代一次。也就是说,只有 10 个元素的列表和 100,000 个元素的巨大列表,运行时间e not in lst
变化很大。
使用remove_adjacent_duplicates
时,您只查看最后一项,因此此比较需要固定的时间,并且不会因列表长度而异。
推荐阅读
- vba - 受保护时如何访问 Word 形式的形状?
- python-3.x - 最小值给出ValueError:Series的真值不明确
- boost - 在 CMake 中对 Boost Python Numpy 的困惑
- ios - 如何防止 UIScrollView 切断按钮?
- c++ - 如何使用好的运算符重载?
- java - 我无法将值保存到 firebase 数据库
- django - 使用响应和 pytest 模拟 query_params
- spring - spring boot 管理页面不断加载应用程序
- javascript - 代码中的这一行如何工作(reduce,groupbyid)
- snowflake-cloud-data-platform - 雪花重试失败的任务