上一篇?<<?
本文?>>?下篇待续
速度比拼——字典VS列表
??学到dict的时候,看到“字典无序(默认),以key查value,不以key多寡论快慢”,一下子惊到了! ??其实,所说的“列表”还是dict.keys()。
????☆程序调试环境☆ ????python 3.6.6 安卓版(手机)
知识点:
??dict.get(key), dict.keys()
技巧:
??对字典添加key,一定要检查key是否已在字典中,以免覆盖已有数据(覆盖数据没得提示🥴)
可以用这几行代码解决:
k = 2
while True:
if st.get(key_2)!=None:
key_2 = name[1:]+str(k)
k += 1
else:
break
??
“不论多寡”,那上百万哩?!当时就生出试试的强烈需求。
??但,上百万的key,让我怎么搞🧐
??碰巧,在做“学生信息管理系统”练习dict的时候,生出了用代码模拟“百万”数据的想法。
??想法有了,就是强烈愿望的trying。一次次的失败之后,终于用代码获取了我想要的百万数据。
??还等什么哩,赶紧码码来run咯。🤗🤗
字典直查key查找,Run的样子 10000学生(2万keys)字典
100w学生记录(200w)字典
200w学生记录(400wkeys)字典
直接dict.get(key)查找完整代码
import json, random, time, pickle
def show_student(d, i):
'''打印学生信息'''
if i.isdigit()==True:
student_number = i
name = list(d.get(i).keys())[0]
info = d.get(i).get(name)
else:
name = i
student_number = list(d.get(i).keys())[0]
info = d.get(i).get(student_number)
print(" "*4+"姓名:%s"%name)
print(" "*4+"学号:%s"%student_number)
print(" "*4+"性别:%(性别)s"%info)
print(" "*4+"民族:%(民族)s"%info)
print(" "*4+"籍贯:%(籍贯)s"%info)
print(" "*4+"专业/学院:%(专业/学院)s"%info)
def show_10(st2):
'''随机打印十个学生信息'''
print("\n"*2)
print('随机10个学生信息:'.rjust(22))
print("~"*42)
tens = random.sample(st2.keys(), k=10)
k = 1
for i in tens:
n = 10
for ii in i:
if ii.isdigit()!=True:
n -= 2
else:
n -= 1
print(('%2.d. '%k).rjust(12), i+' '*n, list(st2.get(i).keys())[0])
k += 1
print("~"*42)
return tens
time_star = time.time()
print("\n"*2, "正在读取'学生信息记录'……".rjust(22))
st2 = pickle.load(open('students_200w×2.dat', 'rb'))
print("\n"*2)
print('Pickle解码字典:\n key个数 %s,数据类型(%s)。\n'%(len(st2), type(st2)))
print("\n", "字典数据结构:{{'6000001': %s}, {'八爪章鱼': %s}}"%(st2.get('6000001'), st2.get('八爪章鱼')))
tens = show_10(st2)
print("\n"*2, "正在查找……".rjust(22), "\n"*2)
sum_sec, k = 0, 1
for i in tens:
search_time1 = time.time()
show_student(st2, i)
second = time.time()-search_time1
s = '%2.d. 查询用时:%f s'%(k, second)
print(s.center(36))
k += 1
sum_sec += second
print("~"*42)
print("\n")
s = "查询用时:%f s,平均用时:%fs"%(sum_sec, sum_sec/10)
print(s.rjust(12), "\n"*2)
second2 = time.time()-time_star
print("\n")
s = "Use time: %.4f s"%second2
print(s.rjust(12), "\n"*2)
遍历dict.keys()查找,Run的样子 10000学生(1万keys)字典
100w学生记录(100w)字典
200w学生记录(200w)字典
遍历查找dict.keys()完整代码
import json, random, time, pickle
def show_student(d, i):
'''打印学生信息'''
student_number = i[0]
name = i[1]
info = d.get(i)
print(" "*4+"姓名:%s"%name)
print(" "*4+"学号:%s"%student_number)
print(" "*4+"性别:%(性别)s"%info)
print(" "*4+"民族:%(民族)s"%info)
print(" "*4+"籍贯:%(籍贯)s"%info)
print(" "*4+"专业/学院:%(专业/学院)s"%info)
def show_10(st2):
'''随机打印十个学生信息'''
print("\n"*2)
print('随机10个学生信息:'.rjust(22))
print("~"*42)
tens = random.sample(st2.keys(), k=10)
k = 1
for i in tens:
print(('%2.d. '%k).rjust(12), i)
k += 1
print("~"*42)
return tens
time_star = time.time()
print("\n"*2, "正在读取'学生信息记录'……".rjust(22))
st2 = pickle.load(open('students_1w×1.dat', 'rb'))
print("\n"*2)
print('Pickle解码字典:\n key个数 %s,数据类型(%s)。\n'%(len(st2), type(st2)))
key = ('600001', '八爪章鱼')
print("\n", "字典数据结构:{%s: %s}"%(key, st2.get(key)))
tens = show_10(st2)
print("\n"*2, "正在查找……".rjust(22), "\n"*2)
sum_sec, k = 0, 1
for i in tens:
search_time1 = time.time()
show_student(st2, i)
second = time.time()-search_time1
s = '%2.d. 查询用时:%f s'%(k, second)
print(s.center(36))
k += 1
sum_sec += second
print("~"*42)
print("\n")
s = "查询用时:%f s,平均用时:%fs"%(sum_sec, sum_sec/10)
print(s.rjust(12), "\n"*2)
second2 = time.time()-time_star
print("\n")
s = "Use time: %.4f s"%second2
print(s.rjust(12), "\n"*2)
??通过实验,字典的优势还是明显的。但数据不太庞大的,列表更有优势。在编程实践中,不用太纠结,根据对象需求,作更优化选择即可。
资源: 1.?百万学生信息记录生成代码 2.?中国全国省市名称dict源码
上一篇?<<?
本文?>>?下篇待续
温馨推荐
作者: 老齐
精品文章:学习编程的正确方法
来源:老齐教室
QQ:4794838(八爪章鱼)
|