2 张孝峰 Python与云 AWS的Python原生应用浅析 Python (boto3)开发 Show me the code 你甚至可以管理你的卫星 更真实的业务场景 VPC 用户访问 www.mydomain.com ECS Cluster 应用负载均衡器 OAuth Task Weather Task Portal Task 12要素应用宣言 尽可能利用现代化的云平台 • 无需猜测容量 • 快速创新,低风险试错 • 摆脱无差异化的工作 Image & Video Textract 自由选择机器学习框架 内置常见框架 全托管运行 或者 自己动手安装 AWS - 运行TensorFlow的首选平台 云中TensorFlow 工作负载 85% 运行在AWS上 Source: Nucleus Research, November 2018 自由切换环境 - TensorFlow 切换到Python3上的TensorFlow和Keras0 码力 | 42 页 | 8.12 MB | 1 年前3
Hello 算法 1.0.0b1 Python版i dic[nums[i]] = i return [] 该方法的时间复杂度为 ?(?) ,空间复杂度为 ?(?) ,体现空间换时间。本方法虽然引入了额外空间使用, 但时间和空间使用整体更加均衡,因此为本题最优解法。 2.5. 小结 算法效率评估 ‧「时间效率」和「空间效率」是算法性能的两个重要的评价维度。 ‧ 我们可以通过「实际测试」来评估算法效率,但难以排除测试环境的干扰,并且非常耗费计算资源。 另一方面,考虑通过优化哈希表的表示方式以缓解哈希冲突,常见的方法有「链式地址」和「开放寻址」。 6.2.1. 哈希表扩容 「负载因子 Load Factor」定义为 哈希表中元素数量除以桶槽数量(即数组大小),代表哈希冲突的严重程度。 负载因子常用作哈希表扩容的触发条件。比如在 Java 中,当负载因子 > 0.75 时则触发扩容,将 HashMap 大小扩充至原先的 2 倍。 与数组扩容类似,哈希表扩容操 映射到桶(数组)索引,从而访问到对应的值 value 。 ‧ 两个不同的 key 经过哈希函数可能得到相同的桶索引,进而发生哈希冲突,导致查询错误。 ‧ 缓解哈希冲突的途径有两种:哈希表扩容、优化哈希表的表示方式。 ‧ 负载因子定义为哈希表中元素数量除以桶槽数量,体现哈希冲突的严重程度,常用作哈希表扩容的触发 条件。与数组扩容的原理类似,哈希表扩容操作开销也很大。 ‧ 链式地址考虑将单个元素转化成一个链表,将所有冲0 码力 | 178 页 | 14.67 MB | 1 年前3
Hello 算法 1.0.0b2 Python版i] dic[nums[i]] = i return [] 该方法的时间复杂度为 ?(?) ,空间复杂度为 ?(?) ,体现空间换时间。本方法虽然引入了额外空间使用, 但时间和空间使用整体更加均衡,因此为本题最优解法。 2.5. 小结 算法效率评估 ‧ 时间效率和空间效率是算法性能的两个重要的评价维度。 ‧ 我们可以通过实际测试来评估算法效率,但难以排除测试环境的干扰,并且非常耗费计算资源。 扩容哈希表来缓解。与数组扩容类似,哈希表扩 容需要将所有键值对从原哈希表移动至新哈希表,开销很大。 编程语言一般使用「负载因子 Load Factor」来评估哈希冲突的严重程度,其定义为哈希表中元素数量除以桶 数量,常用作哈希表扩容的触发条件。比如在 Java 中,当负载因子 > 0.75 时,系统会将 HashMap 容量扩 充至原先的 2 倍。 6.2.2. 链式地址 在原始哈希表 映射到桶(数组)索引,从而访问到对应的值 value 。 ‧ 两个不同的 key 经过哈希函数可能得到相同的桶索引,进而发生哈希冲突,导致查询错误。 ‧ 缓解哈希冲突的途径有两种:哈希表扩容、优化哈希表的表示方式。 ‧ 负载因子定义为哈希表中元素数量除以桶槽数量,体现哈希冲突的严重程度,常用作哈希表扩容的触发 条件。与数组扩容的原理类似,哈希表扩容操作开销也很大。 ‧ 链式地址考虑将单个元素转化成一个链表,将所有冲0 码力 | 186 页 | 15.69 MB | 1 年前3
Hello 算法 1.0.0b4 Python版置,这进一步提高了扩容过程的计算 开销。为此,编程语言通常会预留足够大的哈希表容量,防止频繁扩容。 「负载因子 Load Factor」是哈希表的一个重要概念,其定义为哈希表的元素数量除以桶数量,用于衡量哈希 冲突的严重程度,也常被作为哈希表扩容的触发条件。例如在 Java 中,当负载因子超过 0.75 时,系统会将 哈希表容量扩展为原先的 2 倍。 6.2. 哈希冲突 上节提到,通常 以下给出了链式地址哈希表的简单实现,需要注意: ‧ 为了使得代码尽量简短,我们使用列表(动态数组)代替链表。在这种设定下,哈希表(数组)包含多 个桶,每个桶都是一个列表。 ‧ 以下代码实现了哈希表扩容方法。具体来看,当负载因子超过 0.75 时,我们将哈希表扩容至 2 倍。 # === File: hash_map_chaining.py === class HashMapChaining: """ 链式地址哈希表""" hello‑algo.com 94 self.size = 0 # 键值对数量 self.capacity = 4 # 哈希表容量 self.load_thres = 2 / 3 # 触发扩容的负载因子阈值 self.extend_ratio = 2 # 扩容倍数 self.buckets = [[] for _ in range(self.capacity)] # 桶数组 def hash_func(self0 码力 | 329 页 | 27.34 MB | 1 年前3
Hello 算法 1.1.0 Python版储位置,这进一步增加了扩容过程的计算 开销。为此,编程语言通常会预留足够大的哈希表容量,防止频繁扩容。 负载因子(load factor)是哈希表的一个重要概念,其定义为哈希表的元素数量除以桶数量,用于衡量哈希冲 突的严重程度,也常作为哈希表扩容的触发条件。例如在 Java 中,当负载因子超过 0.75 时,系统会将哈希 表扩容至原先的 2 倍。 6.2 哈希冲突 上一节提到,通常情况 以下代码给出了链式地址哈希表的简单实现,需要注意两点。 ‧ 使用列表(动态数组)代替链表,从而简化代码。在这种设定下,哈希表(数组)包含多个桶,每个桶 都是一个列表。 ‧ 以下实现包含哈希表扩容方法。当负载因子超过 2 3 时,我们将哈希表扩容至原先的 2 倍。 # === File: hash_map_chaining.py === class HashMapChaining: """ 链式地址哈希表""" """ 构造方法""" self.size = 0 # 键值对数量 self.capacity = 4 # 哈希表容量 self.load_thres = 2.0 / 3.0 # 触发扩容的负载因子阈值 self.extend_ratio = 2 # 扩容倍数 self.buckets = [[] for _ in range(self.capacity)] # 桶数组 第 6 章 哈希表0 码力 | 364 页 | 18.42 MB | 1 年前3
Hello 算法 1.0.0 Python版位置,这进一步增加了扩容过程的计算 开销。为此,编程语言通常会预留足够大的哈希表容量,防止频繁扩容。 「负载因子 load factor」是哈希表的一个重要概念,其定义为哈希表的元素数量除以桶数量,用于衡量哈希 冲突的严重程度,也常作为哈希表扩容的触发条件。例如在 Java 中,当负载因子超过 0.75 时,系统会将哈 希表扩容至原先的 2 倍。 6.2 哈希冲突 上一节提到,通常情况 以下代码给出了链式地址哈希表的简单实现,需要注意两点。 ‧ 使用列表(动态数组)代替链表,从而简化代码。在这种设定下,哈希表(数组)包含多个桶,每个桶 都是一个列表。 ‧ 以下实现包含哈希表扩容方法。当负载因子超过 2 3 时,我们将哈希表扩容至原先的 2 倍。 # === File: hash_map_chaining.py === class HashMapChaining: """ 链式地址哈希表""" """ 构造方法""" self.size = 0 # 键值对数量 self.capacity = 4 # 哈希表容量 self.load_thres = 2.0 / 3.0 # 触发扩容的负载因子阈值 self.extend_ratio = 2 # 扩容倍数 self.buckets = [[] for _ in range(self.capacity)] # 桶数组 第 6 章 哈希表0 码力 | 362 页 | 17.54 MB | 1 年前3
Hello 算法 1.0.0b5 Python版置,这进一步提高了扩容过程的计算 开销。为此,编程语言通常会预留足够大的哈希表容量,防止频繁扩容。 「负载因子 load factor」是哈希表的一个重要概念,其定义为哈希表的元素数量除以桶数量,用于衡量哈希 冲突的严重程度,也常被作为哈希表扩容的触发条件。例如在 Java 中,当负载因子超过 0.75 时,系统会将 哈希表容量扩展为原先的 2 倍。 6.2 哈希冲突 上节提到,通常情 以下代码给出了链式地址哈希表的简单实现,需要注意两点。 ‧ 使用列表(动态数组)代替链表,从而简化代码。在这种设定下,哈希表(数组)包含多个桶,每个桶 都是一个列表。 ‧ 以下实现包含哈希表扩容方法。当负载因子超过 0.75 时,我们将哈希表扩容至 2 倍。 # === File: hash_map_chaining.py === class HashMapChaining: """ 链式地址哈希表""" __init__(self): """ 构造方法""" self.size = 0 # 键值对数量 self.capacity = 4 # 哈希表容量 self.load_thres = 2 / 3 # 触发扩容的负载因子阈值 self.extend_ratio = 2 # 扩容倍数 self.buckets = [[] for _ in range(self.capacity)] # 桶数组 def hash_func(self0 码力 | 361 页 | 30.64 MB | 1 年前3
PyWebIO v1.3.1 使用手册能启动一个进程来处理请求。 如果仍然希望使用多进程来提高并发,一种方式是使用 Uvicorn+FastAPI,或者你也可以启动多个 Tor- nado/aiohttp 进程,并在它们之前添加外部的负载均衡软件(如 HAProxy 或 nginx)。这些后端使用 WebSocket 协议与浏览器进行通信,所以不存在上述问题。 PyWebIO 静态资源的托管 PyWebIO 默认使用 CDN 来获取前端的静态资源,如果要将0 码力 | 111 页 | 1.70 MB | 1 年前3
PyWebIO v1.3.3 使用手册能启动一个进程来处理请求。 如果仍然希望使用多进程来提高并发,一种方式是使用 Uvicorn+FastAPI,或者你也可以启动多个 Tor- nado/aiohttp 进程,并在它们之前添加外部的负载均衡软件(如 HAProxy 或 nginx)。这些后端使用 WebSocket 协议与浏览器进行通信,所以不存在上述问题。 PyWebIO 静态资源的托管 PyWebIO 默认使用 CDN 来获取前端的静态资源,如果要将0 码力 | 111 页 | 1.70 MB | 1 年前3
PyWebIO v1.3.2 使用手册能启动一个进程来处理请求。 如果仍然希望使用多进程来提高并发,一种方式是使用 Uvicorn+FastAPI,或者你也可以启动多个 Tor- nado/aiohttp 进程,并在它们之前添加外部的负载均衡软件(如 HAProxy 或 nginx)。这些后端使用 WebSocket 协议与浏览器进行通信,所以不存在上述问题。 PyWebIO 静态资源的托管 PyWebIO 默认使用 CDN 来获取前端的静态资源,如果要将0 码力 | 111 页 | 1.70 MB | 1 年前3
共 68 条
- 1
- 2
- 3
- 4
- 5
- 6
- 7













