python内置数据类型列表list和字典dict的性能

python内置数据类型列表list和字典dict的性能,第1张

    我们来讨论下python的两种最重要的内置数据类型列表list和字典dict上,各种 *** 作的复杂度。
list列表数据类型常用 *** 作性能

1、按索引取值和赋值(v=a[i],a[i]=v)

由于列表的随机访问特性,这两个 *** 作执行时间与列表大小无关,均为O(1)

2、列表的曾长,可以选择append()和_add_() "+"

listappend(v)的执行时间O(1)

list = list + [v],执行时间是O(n+k),因为新增了一个新的列表,其中k是被加的列表长度
举例:4种生成前n个整数列表的方法

如图:
我们可以计算一下这四个函数的耗时,如下
执行结果:
我们可以看到,4种方法运行时间差别很大,test1使用列表连接最慢,而test4使用list range最快,速度相差近200倍。
    如下图,我们总结下list基本 *** 作的性能如何:

上图可知pop()从列表末尾移除元素O(1),但是pop(i)从列表中间移除元素要O(n),为什么呢?

因为从中部移除元素,要把移除元素后面的元素全部向前挪一位,才保证了列表按索引取值和赋值很快,达到O(1)。
dict数据类型:

    字典和列表不同,dict根据key找到value,而list根据index。

    字典最常用的取值get和赋值set,其性能为O(1),而contain(in) *** 作判断字典是否存在某个key,其性能也是O(1)
list和dict的in *** 作对比:

    设计一个性能试验,验证list中检索一个值,对比dict中检索一个值的耗时对比。如下程序:

如果如下:
可见list的in *** 作复杂度为O(n)
PS:大家可以去python官方的算法复杂度网站看看:

>R中的列表类似于Python中的字典(dictionary)或者Peal中的哈希(hash),但又有差别。其实R有一个叫做hash的包,可以实现与Python中的dic及Perl中的hash相同的功能。

R中的list与Python中dictionary的区别:
虽然看起来有点像,但R中的list与Python中的字典还是有很大差别的,主要体现在下面几个方面:

31 可以没有键名
hase是键值对,必须有键名,但R的list可以没有键名,默认键名为[[n]],n为元素所在位置。

32 有序,且允许键值重复
这应该是R的list与Python中的dictionary最大的区别了。Peal中的hash及Python中dic的最大特点就是无序且键值唯一,这样在牺牲有序性的情况下保证了数据存取的高效性。但R中的list这两方面都不满足。其性能与hash及dic应该也有差别吧(没比较过)。

参考:

python字典初始化比较常用的两种方式:dict() 和 {}

性能方面,{}性能更好。

可以通过dist模块,查看两者的字节码:

通过{}初始化,只需要通过一次常量指令即可完成,

通过dict(),需要执行CALL_FUNCTION指令。

还可以通过实际的执行时间来判断:

想在一个列表中确认是否存在某个元素:
通常使用 a in list ,但是这是个O(n)的 *** 作,非常慢

而 a in dictkeys() 是O(1)的

只需要将原来的 list 转化为 dict 即可
亲测提速80-100倍


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/13057723.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-30
下一篇 2023-05-30

发表评论

登录后才能评论

评论列表(0条)

保存