四种高性能数据类型,Python collections助你优化代码、简洁任务

作者: 机器之心 2019-11-04 14:02:12

 在这篇文章中,机器学习工程师 George Seif 介绍了 Python collections 模块非常受欢迎的四种数据类型以及它们各自的使用方法。这些数据类型可以对代码进行优化,进而实现更简洁的任务执行。
Python 的最大优势之一就是它有各种各样的模块和软件包可供选择。这些模块和包将 Python 的功能扩展到了许多流行领域,包括机器学习、数据科学、Web 开发和前端等。其中表现最好的一个就是 Python 内置的 collections 模块了。

一般而言,Python 中的 collections 模块是用于存储列表、字典、元组以及集等数据集合的容器。这些容器嵌入在 Python 中,可以实现开箱即用。collections 模块提供了额外的高性能数据类型,它们可以优化代码,让一些任务变得更加简洁。

四种高性能数据类型,Python collections助你优化代码、简洁任务

本文作者 George Seif(机器学习工程师)。

Counter

官方文档:https://docs.python.org/2/library/collections.html#collections.Counter

Counter 是 dictionary 对象的子类。collections 模块中的 Counter() 函数会接收一个诸如 list 或 tuple 的迭代器,然后返回一个 Counter dictionary。这个 dictionary 的键是该迭代器中的唯一元素,每个键的值是迭代器元素的计数。

首先,我们需要从 collections 包中导入 Counter:

  1. from collections import Counter  

如果要创建一个 Counter 对象,我们也要像对待其他对象类一样,先将它分配给一个变量,而传递给 Counter 对象的惟一变量即是迭代器。

  1. lst = [123321112231211
  2.  
  3. counter = Counter(lst) 

如果我们使用简单的 print 函数(print(counter))把这个 Counter 打印出来,则会得到一些与 dictionary 稍微类似的输出:

  1. Counter({172533}) 

你可以用这些键值访问任何 Counter 项。这与从标准的 Python dictionary 中获取元素的方法完全相同。

  1. lst = [123321112231211
  2.  
  3. counter = Counter(lst) 
  4.  
  5. print(counter[1]) 
  6.  
  7. most_common() 函数 

目前来说,Counter 对象中最有用的函数是 most_common()。当它应用于一个 Counter 对象时,会返回一个 list,这个 list 包含了前 N 个常见的元素及其计数,它们按照常见度降序排列。

  1. lst = [123321112231211
  2.  
  3. counter = Counter(lst) 
  4.  
  5. print(counter.most_common(2)) 

上述代码会打印出以下 tuples 的 list。

  1. [(17), (25)] 

每个 tuple 的首个元素是 list 中的唯一项,第二个元素是计数值。对于「获取 list 中前 3 常见的元素及其计数」这样的问题,这会是一种快速且简单的方法。

如果要了解更多关于 Counter 的功能,可以查看官方文档。

defaultdict

官方文档:https://docs.python.org/2/library/collections.html#collections.defaultdict

defaultdict 的工作方式和平常的 python dictionary 完全相同,只是当你试图访问一个不存在的键时,它不会报错,而是会使用默认值初始化这个键。默认值是根据在创建 defaultdict 对象时作为参数输入的数据类型自动设置的。下面的代码就是一个例子。

相反,它会使用默认值初始化这个键。默认值是根据在创建 defaultdict 对象时作为参数输入的数据类型自动设置的。下面的代码就是一个例子。

  1. from collections import defaultdict 
  2.  
  3. names_dict = defaultdict(int
  4.  
  5. names_dict["Bob"] = 1 
  6.  
  7. names_dict["Katie"] = 2 
  8.  
  9. sara_number = names_dict["Sara"
  10.  
  11. print(names_dict) 

在上面的示例中,传递给 defaultdict 对象的默认值是 int。然后每个键得到了一个值,也就是「Bob」和「Katie」各获得了一个数字。但是在最后一行,我们试着访问了一个尚未定义的键,即「Sara」。

在普通 dictionary 中,这种操作会报错。但是使用 defaultdict 时,将自动为「Sara」初始化一个新键,其值 0 对应于我们的 int 数据类型。因此,最后一行可以把这「Bob」、「Katie」和「Sara」以及对应的值都打印出来。

  1. defaultdict(<class 'int'>, {'Bob'1'Katie'2'Sara'0}) 

如果我们改用 list 来初始化我们的 defaultdict,也就是 names_dict = defaultdict(list),那么「Sara」的值将被初始化成一个空列表 [],打印来的内容就变成了:

  1. defaultdict(<class 'int'>, {'Bob'1'Katie'2'Sara': []}) 

如果要了解更多关于 defaultdict 的功能,可以查看官方文档。

deque

官方文档:https://docs.python.org/2/library/collections.html#collections.deque

queue 是计算机科学中的一种基础数据架构,它遵循先进先出(First-In-First-Out,FIFO)的原则。简单来说,就是添加到 queue 中的第一个对象也必须是要第一个删除。我们只能在 queue 前面插入内容,也只能从后面删除内容——无法对中间内容进行操作。

collections 库中的 deque 对该功能进行了优化。这个方法的一个关键特性是保持队列长度一直不变,也就是说,如果你将 queue 的最大大小设置为 10,那么 deque 将根据 FIFO 原则添加和删除元素,以保持 queue 的最大大小为 10。这是迄今为止 Python 中使用 queue 的最好方法了。

再来看一个例子。我们先创建了一个 deque 对象,然后用从 1 到 10 的整数初始化它。

  1. from collections import deque 
  2.  
  3. my_queue = deque(maxlen=10
  4.  
  5. for i in range(10): 
  6.  
  7.     my_queue.append(i+1
  8.  
  9. print(my_queue) 

在上面的代码中,我们首先初始化 deque,指定它的最大长度为 10。然后,我们通过 for loop 将值插入到 queue 中。注意这里我们使用了与常见 Python list 相同的方式填充 queue。最后,我们把结果打印出来。

  1. deque([12345678910], maxlen=10

因为我们的 queue 被设置成 maxlen=10,而 loop 值添加了 10 个元素,所以这个 queue 包含了从 1 到 10 的所有数字。现在我们来看一下如果继续向里面添加数字会发生什么。

  1. for i in range(1015): 
  2.  
  3.     my_queue.append(i+1
  4.  
  5. print(my_queue) 

在上述代码中,我们又向 queue 中添加了 5 个元素——数字 11 到 15。但是我们的 queue 只能有 10 个元素,所以它需要删除一些元素。因为 queue 必须服从 FIFO 原则,所以它删掉了前五个插入到 queue 中的元素,按照插入顺序就是 [1, 2, 3, 4, 5]。打印的结果如下:

  1. deque([6789101112131415], maxlen=10

如果要了解更多关于 deque 的功能,可以查看官方文档。

namedtuple

官方文档:https://docs.python.org/2/library/collections.html#collections.namedtuple

当你使用 python 创建一个常规 tuple 时,其元素都是通用的,而且没有被命名。这使得你必须记住每个 tuple 元素的精确索引。namedtuple 就可以解决这个问题。

namedtuple() 可以返回一个 tuple,该 tuple 中的每个位置都有固定名称,而且 namedtuple 对象也有通用名称。要使用 namedtuple,需要先为其创建一个模板。下面的代码创建了一个名为「Person」的 namedtuple 模板,其属性为「name」、「age」和「job」。

  1. from collections import namedtuple 
  2.  
  3. Person = namedtuple('Person''name age job'
  4.  
  5. Once the template is created, you can use it to create namedtuple objects. Let’s create 2 namedtuple’s for 2 Persons and print out their representation. 
  6.  
  7. Person = namedtuple('Person''name age job'
  8.  
  9. Mike = Person(name='Mike', age=30, job='Data Scientist'
  10.  
  11. Kate = Person(name="Kate", age=28, job='Project Manager'
  12.  
  13. print(Mike) 
  14.  
  15. print(Kate) 

上述代码很容易理解,我们为 namedtuple 初始化了一个「Person」模板,并初始化了其所有的属性。上述代码最后的打印结果是:

  1. Person(name='Mike', age=30, job='Data Scientist'
  2.  
  3. Person(name='Kate', age=28, job='Project Manager'

因此,namedtuple 让 tuple 的使用更简单、更可读且更有组织性。

如果要了解更多关于 namedtuple 的功能,可以查看官方文档。

代码 开发 AI
上一篇:81页计算机视觉学习指南,助你从萌新长成老司机 下一篇:跨专业自学NLP,这个90后撸出了开源类库HanLP,已在GitHub收获1.5W星
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

AI 崛起的第九个年头,还有哪些大有可为的地方?

2020年还剩下10个月的时间,让我们去预期,人工智能会有哪些重要的趋势呢? CB insights曾就此问题做了一个判断,并给出人工智能的九个重要研究和应用趋势。AI 科技评论在一定程度上认同这些判断,针对这 9 个趋势,我们将做以下分析。

蒋宝尚 ·  1天前
人工智能技术如何将人们从深度伪造的世界中拯救出来

如今,采用深度伪造(Deepfake)生成的视频和音频,人工智能生成的文本、诗歌和歌词,假网站和假新闻进入人们的世界。人们的生活还会真实吗?

Mike Elgan ·  1天前
堪比《黑镜》——AI技术帮助母亲见到已逝的女儿

现在,国外的科技术团队使用AI技术,满足了一位失独母亲的夙愿——他们用摄影测量、虚拟现实和动作捕捉模拟产生了她那2016年去世的女儿。

超级盾 ·  2天前
AI驱动的网络安全团队致力于人类强化

在很多其他行业,流程自动化和AI预示着工作机会的减少,但与之不同的是,威胁情报的未来是强化人类,而不是取代人类。在这方面,我们的研究发现以下三个主要原因。

邹铮 ·  3天前
疫情当前,才知道AI原来是这么好用 精选

近日,工信部表示,将部署运用新一代信息技术支撑服务疫情防控工作。并且工信部特别强调,要通过运用人工智能、大数据、云计算等服务疫情监测分析、人员流动和社区管理等,对疫情开展科学精准防控。

Witkey ·  2020-02-23 15:55:00
AI战“疫”,偶尔小尴尬背后,终极护城河现形

人类与新型冠状病毒的战“疫”仍然在进行中,在这期间,也催生出各类“人工智能+”应用,人工智能技术在此期间迎来大爆发。

张书乐 ·  2020-02-21 18:22:23
谷歌透露:正在内部尝试用AI开发计算机芯片

据谷歌人工智能研究负责人Jeff Dean透露,谷歌正在尝试通过人工智能程序推进专用芯片的内部开发,以加速其软件。在旧金山举行的International Solid State Circuits Conference会上Dean表示:“我们内部正在将人工智能技术用于一系列芯片设计项目中。”

佚名 ·  2020-02-21 11:40:36
人工智能带领人类从信息社会迈向智能社会

人工智能(AI)是指在机器上实现类似乃至超越人类的感知、认知、行为等智能的系统。与人类历史上其他技术革命相比,人工智能对人类社会发展的影响可能位居前列。

新华网客户端 ·  2020-02-20 20:08:40
Copyright©2005-2020 51CTO.COM 版权所有 未经许可 请勿转载