***列表和字典在底层中 谁更快***

字典生成慢,查找快。
列表生成快,查找慢。
如果是数据多,经常需要查询,务必使用字典。

请看??

思路:

生成一个很大的文本文件
分别用列表和字典来存储数据,然后读取并搜索数据
考察列表和字典做为数据结构的时候,存储的时间,搜索和访问的时间
计算两种方案的消耗时间
1.创建百万字符文件

我们需要一个较大的文件,来证明我们的猜想!干脆直接生成一个有百万行的字符串乱码文件。

1).产生一串随机字符:

取一些随机的字符,包括数字,字符,标点和符号等等,一共95个随机字符

2).把字符序列,进行随机化分布

def create_random_nums(nums=None):

random.shuffle(nums)

return nums

直接用random模块,把字符串序列随机化.

3).随机100万行的字符序列,写入文件

def create_file():

chars=get_random_chars()

for i in range(1000000):

with open(‘data.txt‘,‘at‘) as f:

data=create_random_nums(chars)

f.writelines(data)

f.write(‘ ‘)

用个大循环把随机的字符串写入文件中,大概有一百万行,文件大小在100M左右,这里只是试例代码,其实可以用并发写更快一点。

2.用列表做数据结构

先从百万行随机字符串文件中,读取一定数量的数据(10000行数据),
存入10000行放入all_data列表
接着从10000行all_data列表里面随机取1000行
放到一个target_data列表
最后搜索这个target_data列表
3.用字典做数据结构

我们用相同的场景,用字典作为数据结构容器,从百万文件中来读取数据。

考察字典的存储数据的时间,以及字典中的搜索数据的时间。

后面跟个 return all_data,target_data

先从百万行字符串文件中,读取一定数量的字符(假如为10000行)
存到到字典里面,把每一行做为key
接着提取这个字典里面的key,把这个10000行的数据,转为列表
从10000行里面随机取1000行出来,放到target_data列表

4.计算运行时间

我们计算两种数据结构运行的时间,为了更准确。我们运行100次求均值

看一下用列表消耗的时间:

all_data, target_data = read_list_data(file_name, 100000, 1000)

cost=cost_time(all_data,target_data)

print (cost)

0.09532666921615601秒
看一些用字典消耗的时间:

all_data, target_data = read_dict_data(file_name, 100000, 1000)

cost=cost_time(all_data,target_data)

print (cost)

0.00016084909439086914秒
字典的性能是列表的600倍,可见字典作为数据结构,会快快快很多!尤其是非常大的数据存储和读取的时候。

既然字典这么快,那么线性增加搜索,看看耗时如何,刚才是1×××面搜1千,现在我们从二十万搜1千看看,1百×××面搜1千看看。

all_data, target_data = read_dict_data(file_name, 200000, 1000)

cost=cost_time(all_data,target_data)

print (cost)

0.00014181852340698243
all_data, target_data = read_dict_data(file_name, 1000000, 1000)

cost=cost_time(all_data,target_data)

print (cost)

0.00022308111190795897
发现消耗的时间差不多

结论:

为啥字典性能比列表快这么多?这要从字典和列表的原理说起,字典其实是散列表或者说是哈希表!内部存储的时候是根据hash地址来搜索的,搜索的时候不需要从头开始搜索,这也就是为啥哈希表变大,20万和100万的查询的速度差不多!

而列表是什么,Python列表是一种顺序线性表,好处是插入,移除比较快速,但是搜索会慢很多!

综上所述,由于Python中字典的性能远高于列表,Python源码中很多底层的对象都是用字典类型,只要重载hash魔法函数,让它返回一个可哈希的对象,这样的对象就可以用做字典的key。小伙伴今天是不是又学到一招!

原文地址:https://www.cnblogs.com/jiazeng/p/10660578.html

时间: 2024-10-10 05:42:47

***列表和字典在底层中 谁更快***的相关文章

2.1 如何在列表,字典,集合中根据条件帅选数据

#!/usr/bin/env python # -*- coding:utf-8 -*- #2.1 如何在列表,字典,集合中根据天剑筛选数据 # 帅选列表中符合条件的项 data = [1,5,-3,-2,6,8,0,9] res = [] for x in data: if x >=0: res.append(x) # print(res) #2 from random import randint data = [randint(-10,10) for _ in xrange(10)] m

python进阶学习chapter02(列表、字典、集合操作)

如何在列表.字典.集合中筛选数据 列表(元组)的重命名 词频统计的实现 字典的排序 寻找多个字典的公共键 如何让字典保持有序 如何保持历史纪录(使用deque队列) 一.如何在列表.字典.集合中筛选数据 问题引入: 列表:[-10,2,2,3,-2,7,6,9] 找出所有的非负数 字典:{1:90,2:55,3:87...} 找出所有值大于60的键值对 集合:{2,3,8,6,7,5} 找出所有被3整除的数 列表: #方法一,迭代 data=[1,5,-4,-6,0,7,9] res=[] fo

想让容器更快?这五种方法您必须知道!

容器的卖点之一是容器化应用程序的部署速度通常比虚拟机快,且性能更佳. 虽然容器的默认速度比其他基础设施快,这并不意味着没有办法让它们更快.本文将演示如何通过优化Docker容器镜像构建时间.性能和资源消耗,来让容器的速度与性能更超默认值一步. 何为"更快"? 在我们深入探讨Docker优化技巧之前,先容我先解释一下"更快"容器的含义. 在关于Docker的讨论中,"更快"这个单词可以有多种含义.它可以指在容器中运行的进程或应用程序的执行速度,可以

python中列表 元组 字典 集合的区别

列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. (1)列表 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单.比如,统计过去一周我们买过的东西,把这些东西列出来,就是清单.由于我们买一种东西可能不止一次,所以清单中是允许有重复项的.如果我们扩大清单的范围,统计我们过去一周所有的花费情况,那么这也是一个清单,但这个清单里会有类别不同的项,比如我们买东西是一种花费,交水电费也是一种花费,这些项的类型是可以使不同的.pyt

Python3中列表、字典、元组、集合的看法

文首,我先强调一下我是一个弱鸡码农,这个随笔是在我学习完Python3中的元组.字典.列表,集合这四种常见数据的数据类型的一些感想,如果有什么不对的地方欢迎大家予以指正.谢谢大家啦 回归正题:这篇随笔讨论的是列表.字典.元组.集合.因此首先对着三种数据类型进行简要的分析是很有必要的: 1 :列表 列表的特点是以"[ ]" (后面称之为中括号)为主要特点的数据类型.学过其他语言的小伙伴第一反应就是,这不就是一个数组么,确实我个人感觉和数组十分的相似,不过有一下不同: a.在c++/jav

(一)Python入门-3序列:17字典-核心底层原理-内存分析-存储键值对过程

字典核心底层原理(重要) 字典对象的核心是散列表.散列表是一个稀疏数组(总是有空白元素的数组),数组的 每个单元叫做 bucket.每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引 用. 由于,所有bucket 结构和大小一致,我们可以通过偏移量来读取指定 bucket. 一:将一个键值对放进字典的底层过程 >>> a = {} >>> a["name"]="jack" 假设字典 a对象创建完后,数组长度为 8:

[转载]Python 元组、列表、字典、文件

python的元组.列表.字典数据类型是很python(there python is a adjective)的数据结构.这些结构都是经过足够优化后的,所以如果使用好的话,在某些area会有很大的益处. 元组         个人认为就像java的数组,python中的元组有以下特性: 任意对象的有序集合,这条没啥说的,数组的同性: 通过偏移读取: 一旦生成,不可改变: 固定长度,支持嵌套 来例子吧: python 代码 >>> (0, 'haha', (4j, 'y')) (0, '

python学习笔记2—python文件类型、变量、数值、字符串、元组、列表、字典

python学习笔记2--python文件类型.变量.数值.字符串.元组.列表.字典 一.Python文件类型 1.源代码 python源代码文件以.py为扩展名,由pyton程序解释,不需要编译 [[email protected] day01]# vim 1.py #!/usr/bin/python        print 'hello world!' [[email protected] day01]# python 1.py hello world! 2.字节代码 Python源码文件

简明python教程 --C++程序员的视角(四):容器类型(字符串、元组、列表、字典)和参考

数据结构简介 Python定义的类型(或对象)层次结构在概念上可以划分为四种类别:简单类型.容器类型.代码类型 和内部类型. 可以将 PyObject 类之下的所有 Python 类划分为 Python 运行时解释器可以使用的四个主要类别: 简单类型 —— 基本构建块,如 int 和 float. 容器类型—— 保存其他对象. 代码类型—— 封装 Python 程序的元素. 内部类型 —— 程序执行期间使用的类型. 内置的简单类型 Python 有五个内置的简单类型:bool.int.long.