《Python高性能编程》——列表、元组、集合、字典特性及创建过程

  这里的内容仅仅是本人阅读《Python高性能编程》后总结的一些知识,用于自己更好的了解Python机制。本人现在并不从事计算密集型工作:人工智能、数据分析等。仅仅只是出于好奇而去阅读这本书。很多人因为Python不能同时使用多颗CPU(全局解释器锁GIL),而觉得它不能实现高性能。书中有很多介绍避开GIL或者Python虚拟机的方式,例如Cython,PyPy等。

首先我们要说一下时间复杂度,可以帮助我们理解CPython编译器怎么干活:

时间复杂度

  在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义:

  这是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。比如时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍。比如常见的遍历算法。再比如时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。比如冒泡排序,就是典型的O(n^2)的算法,对n个数排序,需要扫描n×n次。再比如O(logn),当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。二分查找就是O(logn)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。O(nlogn)同理,就是n乘以logn,当数据增大256倍时,耗时增大256*8=2048倍。这个复杂度高于线性低于平方。归并排序就是O(nlogn)的时间复杂度。

O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话)

列表和元组

1、列表是动态数组,它们可变且可以重设长度(改变其内部元素个数)。

2、元组是静态的数组,它们不可变,且其内部数据一旦创建便无法改变。

3、元组缓存与Python 运行时环境,这以为着我们每次使用元组都无需访问内核去分配内存。

当创建的数据量及,达到百万千万级以上,合并多个元组,会比一个列表占用更少的空间。

列表在进行append()操作时,会Copy原列表,创建一个更大的列表,然后销毁原列表。在append时,编译器会预创建一部分数据空间,用于以后的添加。

元组在进行合并操作(+)时,会创建一个新的元组,然后销毁旧的元组,元组数据集前后不会发生改变

字典和集合

字典和集合适合于存储能够被索引的数据。当你在使用字典和集合处理可以索引的数据时它的时间复杂度是O(1),但是对于那些不能被索引的数据是徒劳无功的。

  字典与集合在CPython创建时,会像系统申请定量内存块默认最小长度是8,每次改变大小增加到原来的4倍。每次插入数据时会生成索引(二进制数),会在申请的内存存储块中随机插入,如果目标存储块已有数据,那就换个位置,这叫做散列碰撞。

由于字典与集合在插入数据不是每一次都会扩增集合体积,所以会比列表效率高效、省内存空间。虽然会有散列碰撞,但是每次散列碰撞都是二进制数的比较。

集合:在对一批数据进行去重时,不如把这批数据放入集合中。因为在你使用列表存储这批数据时,你需要手动判断是否重复,而且列表会预创建空桶用于存接下来的数据。而集合是一个纯Key的数组,里面的数据时唯一的。

字典:是key:value的形式存储

散列函数:在散列函数中会对字典和列表生成二进制数作为掩码(可以理解为索引,因为在插入、查询时是依靠这个值)。

  应该有一种——而且最好只有唯一的一种——明显的方式去完成它。虽然这种方式可能一开始并不明显,除非你是荷兰人。

——Tim Peters

Python之禅

使用Python的目的是快速实现功能,且代码能够稳定运行。至于优化,所花费的时间可能是产品初创到诞生的数倍时间。

原文地址:https://www.cnblogs.com/shangmo/p/9098106.html

时间: 2024-10-11 10:31:35

《Python高性能编程》——列表、元组、集合、字典特性及创建过程的相关文章

Python基础【数据结构:列表 | 元组 | 集合 | 字典】

序列 序列是Python中最基本的数据结构.包括字符串,列表,元组,Unicode字符串,buffer对象,xrange对象.序列中的每个元素都分配一个数字,即它的索引第一个索引是0,第二个索引是1,依此类推. 列表和元组 列表一个方括号内的逗号分隔值列表中可以存放不同的数据类型. 例:[1,1.2,True,'str',[2,False]]元组与列表类似,不同之处在于元组的元素不能修改.元组使用小括号,列表使用方括号. 例:(1,1.2,True,'str',[2,False]) 列表和元组的

python列表元组集合字典

一.列表 1.列表格式 list1 = ['Google', 'Runoob', 1997, 2000]; list2 = [1, 2, 3, 4, 5 ]; 2.列表访问 list1[0]:Google list2[1:5]:[2,3,4,5] 3.l列表更新 list2[2]=新的值 del list[2] 删除第三个元素 4.列表操作符 len(list1)=list1长度 [1,2,3]+[4,5,6]=[1,2,3,4,5,6] ["hi"]*4=["hi"

Python猫荐书系列之五:Python高性能编程

稍微关心编程语言的使用趋势的人都知道,最近几年,国内最火的两种语言非 Python 与 Go 莫属,于是,隔三差五就会有人问:这两种语言谁更厉害/好找工作/高工资-- 对于编程语言的争论,就是猿界的生理周期,每个月都要闹上一回.到了年末,各类榜单也是特别抓人眼球,闹得更凶. 其实,它们各有对方所无法比拟的优势以及用武之地,很多争论都是没有必要的.身为一个正在努力学习 Python 的(准)中年程序员,我觉得吧,先把一门语言精进了再说.没有差劲的语言,只有差劲的程序员,等真的把语言学好了,必定是"

python高性能编程方法一

python高性能编程方法一 阅读 Zen of Python,在Python解析器中输入 import this. 一个犀利的Python新手可能会注意到"解析"一词, 认为Python不过是另一门脚本... 阅读 Zen of Python,在Python解析器中输入 import this. 一个犀利的Python新手可能会注意到"解析"一词, 认为Python不过是另一门脚本语言. "它肯定很慢!" 毫无疑问Python程序没有编译型语言

【A042】Python高性能编程

[A042]Python高性能编程获取方式:点这里 许多年前,商人让·卡尔森被苦苦挣扎的北欧航空公司(SAS)任命为CEO(首席执行官),担负起了实现盈利的艰巨任务.他以惊人的速度实现了这个目标,以至于他的壮举成为强调业务转型的管理案例和管理文献的关注焦点.Python高性能编程. 他是如何取得这种成就的?授权一线员工现场解决客户服务问题,而无须先经上级核查.这极大地提升了客户满意度.员工士气和企业盈利水平,实现了所有参与方共赢的局面. 就本书而言,卡尔森的理念和经营策略的有趣之处是,他强调了两

py3 字符串 字典 列表 元组 集合

目录 字符串 列表 元组 字典 集合 Python 字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 源码如下: class str(basestring): """ str(object='') -> string Return a nice string representation of the object. If the argument is a string, the return value is t

列表/元组/字符串/字典/集合/文件/字符编码

1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 1 names = ['Alex',"Tenglan",'Eric'] 通过下标访问列表中的元素,下标从0开始计数 1 2 3 4 5 6 7 8 >>> names[0] 'Alex' >>> names[2] 'Eric' >>> names[-1] 'Eric' >>> names[-2] #

python核心编程 第七章 字典,集合 练习

#encoding=utf-8import random#dict.update(dict2)a 将字典 dict2 的键-值对添加到字典 dict# 7–1. 字典方法.哪个字典方法可以用来把两个字典合并到一起?dict1 = {1:'w',2:'y'}dict2 = {3:'t'}dict1.update(dict2)print dict1 # 7–2. 字典的键.我们知道字典的值可以是任意的 Python 对象,那字典的键又如何呢?请试# 着将除数字和字符串以外的其他不同类型的对象作为字典

Python数据结构之列表元组字典的用法

数据结构的含义 在学习数据结构之前,我们先来了解下数据结构的含义.数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python语言中,最基本的数据结构是序列(sequence).序列中的每个元素被分配一个序号----即元素的位置,称为索引或下标,索引从0开始递增. 典型的序列包括列表.元组和字符串.其中,列表是可变的(可修改),而元组和字符串是不可变的(一旦创建了就是固定的).列表.元组和字符串也是较常用的数据结构