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倍
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)