当前位置:首页 » 编程语言 » python字典的效率

python字典的效率

发布时间: 2024-04-09 08:25:19

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

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

list列表数据类型常用操作性能:

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

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

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

list.append(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官方的算法复杂度网站看看:

https://wiki.python.org/moin/TimeComplexity

2. python中字典常用的方法有哪些,分别有什么作用

写法:字典序列[key] = 值 ***字典为可变类型

常用方法:
1、# 新增字典中的数据
dict1 = {'name':'huu','age':20,'gender':'男'}
dict1['id'] = 133
print(dict1)

2、# 修改字典中的数据
dict1['name'] = 'xiauaiguai'
print(dict1)
3、删除字典或删除字典中指定键值对
del()/del:

dict1 = {'name':'huanghu','age':30,'gender':'男'}

# del(dict1) 直接将字典删除了,运行报错

del dict1['name']
print(dict1)
# del dict1[names] 删除不存在的key,运行报错

4、清空字典
clear():
dict1.clear() # 清空字典
print(dict1)

5、查找
key值查找
如果当前查找的key存在则返回对应的值,否则则报错
函数查找
get():如果当前查找的key不存在则返回第二个参数值(默认值),
如果省略第二个参数则返回 None
key()

dict1 = {'name':'huhu','age':20,'gender':'男'}

print(dict1['name']) # huhu
print(dict1['id']) # 报错

# 1, get()查找

print(dict1.get('name')) # huanghu
print(dict1.get('id',133)) # 133--如果当前查找的key不存在则返回第二个参数值(默认值)
print(dict1.get('id')) # None--如果省略第二个参数则返回 None

# 2, keys() 查找字典中所有的key,返回可迭代对象
print(dict1.keys()) # dict_keys(['name', 'age', 'gender'])

# 3,values() 查找字典中所有的values,
print(dict1.values()) # dict_values(['huanghu', 30, '男'])

# 4, items() 查找字典中所有的键值对,返回可迭代对象,里面的数据是元组,
元组数据1是字典中的key,元组数据2是字典key对应的值
print(dict1.items()) # dict_items([('name', 'huahu'), ('age', 20), ('gender', '男')])

3. python 字典为什么这么快

因为字典是通过键来索引的,关联到相对的值,理论上他的查询复杂度是O(1)。
哈希表(也叫散列表),根据关键值对(Key-value)而直接进行访问的数据备羡结构。它通过把key和value映射到表中一个位置来访问记录,这种查询速度非常快,更新也快。而这个映射函数叫做哈希函数,存放值的数组叫做哈希表。 哈希函数的实唯肢现方式决定了哈希表的指滚世搜索效率。

4. python中字典的使用方法怎么样的

字典理解如下
另一个非常有用的 Python 内建数据类型是 字典 (参见 Mapping Types — dict )。字典在某些语言中可能称为 联合内存 ( associative memories )或 联合数组 ( associative arrays )。序列是以连续的整数为索引,与此不同的是,字典以 关键字 为索引,关键字可以是任意不可变类型,通常用字符串或数值。如果元组中只包含字符串和数字,它可以作为关键字,如果它直接或间接的包含了可变对象,就不能当作关键字。不能用列表做关键字,因为列表可以用索引、切割或者 append() 和 extend() 等方法改变。
理解字典的最佳方式是把它看作无序的键: 值对 (key:value 对)集合,键必须是互不相同的(在同一个字典之内)。一对大括号创建一个空的字典: {} 。初始化列表时,在大括号内放置一组逗号分隔的键:值对,这也是字典输出的方式。
字典的主要操作是依据键来存储和析取值。也可以用 del 来删除键:值对(key:value)。如果你用一个已经存在的关键字存储值,以前为该关键字分配的值就会被遗忘。试图从一个不存在的键中取值会导致错误。
对一个字典执行 list(d.keys()) 将返回一个字典中所有关键字组成的无序列表(如果你想要排序,只需使用 sorted(d.keys()) )。[2] 使用 in 关键字(指Python语法)可以检查字典中是否存在某个关键字(指字典)。

5. python 字典和元组遍历速度哪个快

当然是元组了,元组就相当于数组,直接按照索引去取元素。而字典是按照key去取元素(类似于hash表),速度当然比不上元组了。下面的测试可以提供一些直观的感觉。


$python-mtimeit-s'a=dict(a=12,b=13,c=14)''fork,vina.items():''pass'
1000000loops,bestof3:0.391usecperloop
$python-mtimeit-s'a=(12,13,14)''forvina:''pass'
10000000loops,bestof3:0.12usecperloop


可以看到遍历同样是三个元素的dict的时间大致上是tuple的3倍左右。 (实际上这个时间包括了创建 dict 和 tuple 的时间,创建dict的时间也是要大于创建tuple的时间的,这里就不细分了,总之,dict的创建、访问时间一定是大于tuple的)


但是在python中,dict是做过极度优化的,其效率已经非常高了,因为在python中它的使用实在是太广了。所以在实际编程中,一般我们只根据实际需求来考虑使用什么数据结构 (dict, list, set, tuple),而不是根据不同数据结构的访问速度差别。

6. python 字典和元组,列表取数速度哪个快

查询的话字典快一点,如果知道索引直接读取,应该是元组快一点。

7. 濡备綍杩愮敤python涓镄勫瓧鍏革纻

瀛楀吀灞炰簬python涓镄勪竴绉嶆暟鎹缁撴瀯锛屽畠鏄鐢遍敭鍊煎(key=value)缁勬垚镄勶纴鍏朵腑钬榢ey钬樻槸鍞涓镄勪笉鍙鍙樼殑銆傝屽兼槸鍙鍙樼殑锛屼笖鍙浠ュ彇浠讳綍鏁版嵁绫诲瀷銆傚湪python缂栫▼涓缁忓父浣跨敤鍒板瓧鍏革纴杩愮敤濂藉瓧鍏稿彲浠ユ椂鎴戜滑鍦ㄧ紪绋嬩腑镟村姞杞绘涧銆傞偅涔埚备綍浣跨敤瀛楀吀锻锛屼粖澶╁皬缂栧氨涓澶у朵粙缁崭笅瀛楀吀镄勫嚑绉岖亩鍗曚娇鐢ㄦ柟娉曘

镓揿紑PyCharm锛屽彸阌镣瑰嚮鍒涘缓濂界殑椤圭洰钖嶏纴阃夋嫨銆恘ew銆--銆怭ython File銆戞柊寤轰竴涓猵ython鏂囦欢銆傛枃浠跺悕镙规嵁镊宸辨儏鍐靛~鍐欍傝繖閲屽皬缂栦互test.py鏂囦欢涓轰緥銆

瑕佽繍鐢ㄥ瓧鍏革纴闾d箞灏卞繀椤诲厛瀹氢箟瀛楀吀銆傚瓧鍏告槸鐢遍敭鍊煎(key=value)缁勬垚镄勶纴姣忎釜阌鍊煎逛箣闂撮氲繃阃楀彿(,)鍒嗗壊寮 ,渚嫔傦细di={'name':'澶崭粐涔嬬帇','day':'22'}

姝ゅ栵纴鎴戜滑杩桦彲浠ラ氲繃dict()鍑芥暟𨱒ュ垱寤轰竴涓瀛楀吀锛屽湪dict𨰾鍙烽噷闱㈡垜浠阃氲繃鍙橀噺璧嫔肩殑褰㈠纺杈揿叆鍐呭广备緥濡:d=dict(a=123,b='hello')

瀹氢箟濂藉瓧鍏镐箣钖庯纴鎴戜滑闇瑕佸幓浣跨敤瀛楀吀閲岀殑鍊硷纴闾d箞濡备綍铡昏块梾瀛楀吀閲岄溃镄勫煎憿锛熷洜涓哄瓧鍏告槸阌鍊煎圭殑褰㈠纺锛屾墍浠ユ垜浠鍙浠ラ氲繃阌𨱒ヨ块梾瀵瑰簲镄勫笺傝繖閲屽皬缂栦互鍙栤榥ame钬欑殑鍊间负渚嬶纴鍦╰est.py鏂囦欢涓杈揿叆print(di['name']),铹跺悗鍙抽敭镣瑰嚮钬渞un钬濊繘琛岃繍琛岋纴鍗冲彲镆ョ湅杈揿嚭瀵瑰簲镄勫笺

瀛楀吀閲岀殑鍏幂礌涓嶅彲鑳戒竴鎴愪笉鍙樼殑锛岄偅涔堟垜浠瑕佸备綍铡讳慨鏀瑰瓧鍏搁噷镄勫厓绱犲憿锛熷悓镙锋垜浠鍙浠ラ氲繃阌𨱒ヨ繘琛屼慨鏀瑰瑰簲镄勫笺傚湪python鏂囦欢涓杈揿叆di['day']='25',骞朵笖阃氲繃print(di) 杈揿嚭瀛楀吀锛屽湪杈揿嚭缁撴灉涓鍙浠ョ湅鍒伴敭钬榙ay钬椤瑰簲镄勫煎彉涓25浜嗐 娉锛氩湪瀛楀吀涓阌鏄鍞涓镄勶纴鍊兼槸鍙鍙樼殑锛屽苟涓斿彲浠ュ彇浠讳綍鏁版嵁绫诲瀷銆

鍦╰est.py鏂囦欢涓杈揿叆di['color']='绾㈣壊',铹跺悗阃氲繃print(di)杈揿嚭瀛楀吀锛屾垜浠鍙浠ョ湅鍒板瓧鍏搁噷澶氩嚭浜哻olor杩欎釜阌鍊煎广傞氲繃杩欎釜鏂规硶鎴戜滑鍙浠ュ悜瀛楀吀閲屾彃鍏ユ垜浠闇瑕佺殑鍏幂礌銆 娉:python3.6涔嫔悗瀛楀吀鏄链夊簭镄勶纴锲犱负灏忕紪鐢ㄧ殑鏄痯ython3.5鐗堟湰镄勶纴镓浠ヨ緭鍑虹粨鏋沧槸镞犲簭镄勚

姝ゅ栬缮鍙浠ラ氲繃setdefault鏂规硶𨱒ユ煡璇㈠拰娣诲姞瀛楀吀鍏幂礌銆傛垜浠闇瑕佸湪test.py鏂囦欢涓杈揿叆print(di.setdefault('name'))锛岃繖涓钬榥ame钬欐槸瀛楀吀閲屽凡缁忔湁镄勯敭锛屾墍浠ヨ繑锲炵殑缁撴灉寮濮嬬洿鎺ヨ緭鍑哄瑰簲镄勫笺傝緭鍏 di.setdefault('age',18) print(di) 鍙抽敭镣瑰嚮杩愯岋纴杩欐椂鎴戜滑鍙浠ョ湅鍒板瓧鍏稿炲姞浜嗏榓ge钬栾繖涓阌鍊煎广

链钖庣粰澶у朵粙缁崭笅镐庝箞鍒犻櫎瀛楀吀閲岄溃镄勫厓绱犮傞氲繃pop鏂规硶鎴戜滑鍙浠ユ寚瀹氩垹闄ゅ瑰簲镄勫厓绱犮傚湪test.py鏂囦欢涓杈揿叆 di.pop('day') print(di) 铹跺悗鍙抽敭镣瑰嚮杩愯岋纴灏卞彲浠ュ湪杩愯岀粨鏋滀腑鐪嫔埌钬榙ay钬欑殑阌鍊煎规病链変简

热点内容
java的命名空间 发布:2024-11-28 10:56:22 浏览:374
电信宽带wifi如何更改密码 发布:2024-11-28 10:56:22 浏览:365
安卓在哪里关闭云备份 发布:2024-11-28 10:49:55 浏览:558
数据在计算机中的存储 发布:2024-11-28 10:49:54 浏览:621
php二级分类 发布:2024-11-28 10:40:49 浏览:851
机顶盒主时钟同步服务器地址修改 发布:2024-11-28 10:40:43 浏览:333
androidstudio输出 发布:2024-11-28 10:36:20 浏览:591
华为手机的音乐在哪个文件夹 发布:2024-11-28 10:34:54 浏览:720
赛尔号万能脚本 发布:2024-11-28 10:34:44 浏览:629
逆战端游二级密码在哪里设置 发布:2024-11-28 10:28:18 浏览:867