在Python中,哪种数据结构更高效/快速?假设顺序对我来说不重要,无论如何我都会检查重复,Python集比Python列表慢吗?
当前回答
博士tl;
数据结构(DS)很重要,因为它们用于对数据执行操作,这基本上意味着:获取一些输入,处理它,然后返回输出。
在某些特定情况下,一些数据结构比其他数据结构更有用。因此,问哪个(DS)更高效/更快是很不公平的。这就像问刀和叉之间哪个工具更有效率一样。我的意思是,这取决于具体情况。
列表
列表是可变序列,通常用于存储同构项的集合。
Sets
set对象是不同哈希对象的无序集合。它通常用于测试成员关系,从序列中删除重复项,并计算数学操作,如交集,并,差,和对称差。
使用
从一些答案中可以明显看出,在遍历值时,列表要比集合快得多。另一方面,在检查一个项是否包含在set中时,set要比list快。因此,你唯一能说的是,对于某些特定的操作,列表比集合好,反之亦然。
其他回答
这取决于你打算用它做什么。
当涉及到确定一个对象是否存在于set中时(如x在s中),set的速度要快得多,但它的元素是没有顺序的,因此您不能像在列表中那样通过索引访问项目。在实践中,迭代集的速度也比较慢。
您可以使用timeit模块查看哪种方法更适合您的情况。
当您只想遍历值时,列表比集合略快。
但是,如果您想检查一个项是否包含在集合中,那么集合要比列表快得多。但是它们只能包含独特的项目。
事实证明,元组的执行方式几乎与列表完全相同,除了它们的不可变性。
迭代
>>> def iter_test(iterable):
... for i in iterable:
... pass
...
>>> from timeit import timeit
>>> timeit(
... "iter_test(iterable)",
... setup="from __main__ import iter_test; iterable = set(range(10000))",
... number=100000)
12.666952133178711
>>> timeit(
... "iter_test(iterable)",
... setup="from __main__ import iter_test; iterable = list(range(10000))",
... number=100000)
9.917098999023438
>>> timeit(
... "iter_test(iterable)",
... setup="from __main__ import iter_test; iterable = tuple(range(10000))",
... number=100000)
9.865639209747314
确定是否存在一个对象
>>> def in_test(iterable):
... for i in range(1000):
... if i in iterable:
... pass
...
>>> from timeit import timeit
>>> timeit(
... "in_test(iterable)",
... setup="from __main__ import in_test; iterable = set(range(1000))",
... number=10000)
0.5591847896575928
>>> timeit(
... "in_test(iterable)",
... setup="from __main__ import in_test; iterable = list(range(1000))",
... number=10000)
50.18339991569519
>>> timeit(
... "in_test(iterable)",
... setup="from __main__ import in_test; iterable = tuple(range(1000))",
... number=10000)
51.597304821014404
from datetime import datetime
listA = range(10000000)
setA = set(listA)
tupA = tuple(listA)
#Source Code
def calc(data, type):
start = datetime.now()
if data in type:
print ""
end = datetime.now()
print end-start
calc(9999, listA)
calc(9999, tupA)
calc(9999, setA)
比较所有3个迭代10次后的输出: 比较
列表性能:
>>> import timeit
>>> timeit.timeit(stmt='10**6 in a', setup='a = list(range(10**6))', number=1000)
15.08
设置性能:
>>> timeit.timeit(stmt='10**6 in a', setup='a = set(range(10**6))', number=1000)
3.90e-05
您可能想考虑元组,因为它们类似于列表,但不能修改。它们占用的内存更少,访问速度更快。它们没有列表那么灵活,但比列表更有效。它们的正常用途是作为字典键。
集合也是序列结构,但与列表和元组有两个不同。尽管集合确实有一个顺序,但这个顺序是任意的,不受程序员的控制。第二个区别是集合中的元素必须是唯一的。
根据定义设置。[python | wiki]。
>>> x = set([1, 1, 2, 2, 3, 3])
>>> x
{1, 2, 3}
集合更快,而且你可以得到更多有集合的函数,比如你有两个集合:
set1 = {"Harry Potter", "James Bond", "Iron Man"}
set2 = {"Captain America", "Black Widow", "Hulk", "Harry Potter", "James Bond"}
我们可以很容易地连接两个集合:
set3 = set1.union(set2)
找出两者的共同点:
set3 = set1.intersection(set2)
找出两者的不同之处:
set3 = set1.difference(set2)
还有更多!试试吧,很有趣的!此外,如果你必须处理两个列表中的不同值或两个列表中的通用值,我更喜欢将列表转换为集合,许多程序员都是这样做的。 希望它能帮助你:-)
推荐文章
- 将一个列表分成大约相等长度的N个部分
- Python __str__与__unicode__
- 在python中,del和delattr哪个更好?
- 如何动态加载Python类
- 有没有办法在python中做HTTP PUT
- “foo Is None”和“foo == None”之间有什么区别吗?
- .NET反射的成本有多高?
- 类没有对象成员
- Django模型“没有显式声明app_label”
- 熊猫能自动从CSV文件中读取日期吗?
- 在python中zip的逆函数是什么?
- 有效的方法应用多个过滤器的熊猫数据框架或系列
- 在c#中检查字符串是否只包含数字的最快方法
- 如何检索插入id后插入行在SQLite使用Python?
- 我如何在Django中添加一个CharField占位符?