这篇“Python列表和集合效率源码对比分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python列表和集合效率源码对比分析”文章吧。
数据查找效率
关于集合和列表数据查找效率差距到底有多大?先看一组实例:
import time
import random
nums = [random.randint(0, 2000000) for i in range(1000)]
list_test = list(range(1000000))
set_test = set(list_test)
count_list, count_set = 0, 0
t1 = time.time()# 测试在列表中进行查找
for num in nums:
if num in list_test:
count_list += 1
t2 = time.time()
for num in nums:# 测试在集合中进行查找
if num in set_test:
count_set += 1
t3 = time.time()# 测试在集合中进行查找
print('找到个数,列表:{},集合:{}'.format(count_list, count_set))
print('使用时间,列表:{:.4f}s'.format(t2 - t1))
print('使用时间,集合:{:.4f}s'.format(t3 - t2))
输出结果为:
找到个数,列表:515,集合:515
使用时间,列表:7.7953s
使用时间,集合:0.0010s
从上面例子可以清楚地看出,集合的查找效率远远高于列表,因此在不同的应用场景下,一定要选择合适的数据类型,在小数据量下看不出来性能区别,一旦换到大数据量下,就会变得差异性很大。
数据存储开销
集合的查找效率比列表要快得多,主要就是他们的存储原理不一样,集合需要消耗更多的空间来存储额外的信息,用空间开销来换时间效率,接下来我们通过getsizeof()函数看看他们存储开销的差异,getiszeof()函数是python的sys模块中用来获取对象内存大小的函数,返回的大小以字节为单位。
import sys
import random
list_test = list(range(1000000))
set_test = set(range(1000000))
print('列表占用大小:', sys.getsizeof(list_test))
print('集合占用大小:', sys.getsizeof(set_test))
输出结果为:
列表占用大小:9000112
集合占用大小:33554656
从结果可以看出,同样的数据内容,集合存储的开销是列表的好几倍。