Python列表的替代

《流畅的Python》

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/1/19 10:30
# @Author  : Lili
# @File    : exp6.py
# @Description : 当列表不是首选时, 数组

# 数组
# 对于需要一个只包含数字的列表,array.array比list更高效
# .pop .insert .extend .frombytes .tofile
from array import array
from random import random

# floats = array('d', (random() for i in range(10**7)))
# # 建立双精度浮点数组,类型码是'd'
# fp = open('floats.bin', 'wb')
# floats.tofile(fp)
# fp.close()
# floats2 = array('d')
# fp = open('floats.bin', 'rb')
# floats2.fromfile(fp, 10**7)
# fp.close()
# print(floats[-1], floats2[-1])
# 另一个快速序列化数字类型的方法是使用pickle模块,pickle.dump 处理浮点数组的速度几乎跟 array.
# tofile 一样快。不过前者可以处理几乎所有的内置数字类型,包含复数、嵌套集合,甚至用户自定义的类。前提是这些类没有什么特别复杂的实现
arr = array('b', (10, 121, 55, 34, 35, 78, 120))
arr2 = array('h', (10, 20, 23, 34, 35, 78, 120))
print(arr)
arr2.byteswap() # 翻转每个元素的字节序列
print(arr2)
# 排序 arr.typecode 代表数组元素在C语言中的数据类型
arr = array(arr.typecode, sorted(arr))
arr.reverse() # 就地调转序列中元素位置
print(arr)

# Python 数组跟 C 语言数组一样精简。创建数组需要一个类型码,这个类型码用来表示在底层的 C 语言应该存放怎样的数据类型。比如 b 类型码代表的是有符号的字符(signed
# char),因此 array('b') 创建出的数组就只能存放一个字节大小的整数,范围从 -128 到127,这样在序列很大的时候,我们能节省很多空间。
# 而且 Python 不会允许你在数组里存放除指定类型之外的数据。

# memoryview 内存视图 memoryview 是一个内置类,它能让用户在不复制内容的情况下操作同一个数组的不同切片。
# 内存视图其实是泛化和去数学化的 NumPy 数组。它让你在不需要复制内容的前提下,
# 在数据结构之间共享内存。其中数据结构可以是任何形式,比如 PIL 图片、SQLite
# 数据库和 NumPy 的数组,等等。这个功能在处理大型数据集合的时候非常重要。
# 我们利用 memoryview 精准地修改了一个数组的某个字节,这个数组的元素是 16 位二进制整数。
numbers = array('h', [-2, -1, 0, 1, 2])
memv = memoryview(numbers)
print(len(memv), memv[0])
memv_oct = memv.cast('B')
print(memv_oct.tolist())
memv_oct[5] = 4
print(numbers)

# NumPy 和 SciPy
# 凭借着 NumPy 和 SciPy 提供的高阶数组和矩阵操作,Python 成为科学计算应用的主流语
# 言。NumPy 实现了多维同质数组(homogeneous array)和矩阵,这些数据结构不但能处理
# 数字,还能存放其他由用户定义的记录。通过 NumPy,用户能对这些数据结构里的元素进
# 行高效的操作。

# SciPy 是基于 NumPy 的另一个库,它提供了很多跟科学计算有关的算法,专为线性代数、
# 数值积分和统计学而设计。SciPy 的高效和可靠性归功于其背后的 C 和 Fortran 代码,而这
# 些跟计算有关的部分都源自于 Netlib 库(http://www.netlib.org)。换句话说,SciPy 把基于
# C 和 Fortran 的工业级数学计算功能用交互式且高度抽象的 Python 包装起来,让科学家如
# 鱼得水。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/1/19 11:02
# @Author  : Lili
# @File    : exp7.py.py
# @Description : 当列表不是首选时, 双向队列,和其他形式的队列

# collections.deque 类(双向队列)是一个线程安全、可以快速从两端添加或者删除元素的
# 数据类型。而且如果想要有一种数据类型来存放“最近用到的几个元素”,deque 也是一个
# 很好的选择。这是因为在新建一个双向队列的时候,你可以指定这个队列的大小,如果这
# 个队列满员了,还可以从反向端删除过期的元素,然后在尾端添加新的元素。
from collections import deque
dq = deque(range(10), maxlen=10)
print(dq)
dq.rotate(3)
print(dq)
dq.rotate(-4)
print(dq)
dq.appendleft(-1)
print(dq)
dq.extend((11, 22, 33))
print(dq)
dq.extendleft((10, 20, 30, 40))
print(dq)

# 其他Python标准库中对队列的实现
# queue
# 提供了同步(线程安全)类 Queue、LifoQueue 和 PriorityQueue,不同的线程可以利用
# 这些数据类型来交换信息。这三个类的构造方法都有一个可选参数 maxsize,它接收正
# 整数作为输入值,用来限定队列的大小。但是在满员的时候,这些类不会扔掉旧的元素
# 来腾出位置。相反,如果队列满了,它就会被锁住,直到另外的线程移除了某个元素而
# 腾出了位置。这一特性让这些类很适合用来控制活跃线程的数量。
# multiprocessing
# 这个包实现了自己的 Queue,它跟 queue.Queue 类似,是设计给进程间通信用的。同时
# 还有一个专门的 multiprocessing.JoinableQueue 类型,可以让任务管理变得更方便。
# asyncio
# Python 3.4 新提供的包,里面有 Queue、LifoQueue、PriorityQueue 和 JoinableQueue,
# 这些类受到 queue 和 multiprocessing 模块的影响,但是为异步编程里的任务管理提供
# 了专门的便利。
# heapq
# 跟上面三个模块不同的是,heapq 没有队列类,而是提供了 heappush 和 heappop 方法,
# 让用户可以把可变序列当作堆队列或者优先队列来使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值