• Python项目开发实战第2版


    Python项目开发实战第2版

    版权声明

    引言

    希望能不做不想做的事

    希望学会好的方法并付诸实践

    希望工作时有个好心情

    谢辞

    阅读本书前的准备

    第 1 部分 Python 开发入门

    1 Python 入门
    1.1 安装 Python
    1.1.1 安装 deb 包
    1.1.2 安装第三方包
    1.1.3 virtualenv 的使用方法
    1.1.4 多版本 Python 的使用

    ####### ◉ 借助 virtualenv 分别使用不同版本的 Python

    1.2 安装 Mercurial
    1.2.1 Mercurial 概述
    1.2.2 安装 Mercurial
    1.2.3 创建版本库
    1.2.4 文件操作
    1.3 编辑器与辅助开发工具
    1.3.1 编辑器

    ####### ◉ Vim
    ####### ◉ Emacs
    ####### ◉ PyCharm

    1.3.2 开发辅助工具

    ####### ◉ 交互模式
    ####### ◉ flake8(编码格式 / 语法检测)
    ####### ◉ pdb(调试器)

    1.4 小结
    2 开发 Web 应用
    2.1 了解Web 应用
    2.1.1 Web 应用是什么
    2.1.2 Web 应用与桌面应用的区别
    2.1.3 Web 应用的机制

    ####### ◉ Web 应用与 CGI
    ####### ◉ Web 应用与应用服务器

    2.2 前置准备
    2.2.1 关于 Flask
    2.2.2 安装Flask
    2.3 Web 应用的开发流程
    2.4 明确要开发什么应用
    2.4.1 留言板应用的需求
    2.4.2 明确必备的功能
    2.4.3 明确必备的页面
    2.5 页面设计
    2.5.1 确定成品页面的形式
    2.5.2 编写 HTML 和 CSS
    2.6 实现功能
    2.6.1 保存留言数据
    2.6.2 获取已保存的留言列表
    2.6.3 用模板引擎显示页面
    2.6.4 准备评论接收方的 URL
    2.6.5 调整模板的输出
    2.7 查看运行情况
    3 Python 项目的结构与包的创建
    3.1 Python 项目
    3.2 环境与工具
    3.2.1 用 virtualenv 搭建独立环境

    ####### ◉ virtualenv
    ####### ◉ virtualenv 的使用方法
    ####### ◉ virtualenv 的选项

    3.2.2 用 pip 安装程序包

    ####### ◉ pip 的选项
    ####### ◉ 安装程序包
    ####### ◉ 记录程序包一览表
    ####### ◉ 卸载程序包

    3.2.3 小结
    3.3 文件结构与发布程序包
    3.3.1 编写 setup.py

    ####### ◉ setup.py 的命令

    3.3.2 留言板的项目结构
    3.3.3 setup.py 与 MANIFEST.in——设置程序包信息与捆绑的文件

    ####### ◉ setup.py
    ####### ◉ MANIFEST.in
    ####### ◉ 确认运行情况

    3.3.4 setup.py——创建执行命令
    3.3.5 python setup.py sdist——创建源码发布程序包
    3.3.6 提交至版本库
    3.3.7 README.rst——开发环境设置流程
    3.3.8 变更依赖包
    3.3.9 通过 requirements.txt 固定开发版本
    3.3.10 python setup.py bdist_wheel——制作用于 wheel 发布的程序包
    3.3.11 上传到 PyPI 并公开

    ####### ◉ 描述程序包的详细信息
    ####### ◉ 检查 setup 函数内指定的参数

    3.3.12 小结
    3.4 小结

    第 2 部分 团队开发的周期

    4 面向团队开发的工具
    4.1 问题跟踪系统
    4.1.1 Redmine
    4.1.2 安装Redmine
    4.1.3 Redmine 的设置
    4.1.4 插件

    ####### ◉ Redmine reStructuredText Formatter
    ####### ◉ SCM Creator plugin
    ####### ◉ Slack chat plugin
    ####### ◉ Issue Template plugin

    4.2 版本控制系统
    4.2.1 Mercurial 与 Redmine 的联动
    4.2.2 用于生成版本库的插件
    4.3 聊天系统
    4.3.1 Slack
    4.3.2 Slack 的特点

    ####### ◉ 能轻松导入的 Web 服务
    ####### ◉ 能与许多外部服务联动
    ####### ◉ 可创建 bot
    ####### ◉ 强大的 @ 功能加速团队内的信息传递
    ####### ◉ URL 和文件的预览功能
    ####### ◉ 其他特点
    ####### ◉ 收费版
    ####### ◉ Slack 应用

    4.3.3 Slack 做不到的事
    4.3.4 Slack 的注册
    4.4 对团队开发有帮助的工具
    4.4.1 Dropbox
    4.4.2 Google Drive
    4.5 小结
    5 项目管理与审查
    5.1 项目管理与问题的区分使用
    5.1.1 项目管理的前置准备工作

    ####### ◉ 添加成员
    ####### ◉ 添加版本
    ####### ◉ 添加问题类别

    5.1.2 创建问题
    5.1.3 整理问题
    5.1.4 分割问题
    5.2 问题模板
    5.2.1 安装插件
    5.2.2 问题模板的使用方法

    ####### ◉ 启用问题模板功能
    ####### ◉ 创建模板
    ####### ◉ 套用模板

    5.2.3 Global Issue Templates
    5.2.4 问题模板示例

    ####### ◉ 功能
    ####### ◉ 错误
    ####### ◉ 任务
    ####### ◉ 需求讨论

    5.3 问题驱动开发
    5.3.1 别急着敲代码,先建问题
    5.3.2 创建与问题编号同名的分支

    ####### ◉ 主题分支与问题驱动开发

    5.3.3 让发布与分支相对应
    5.3.4 分支的合并
    5.4 审查
    5.4.1 为什么需要审查
    5.4.2 审查委托:代码审查篇

    ####### ◉ 准备资料
    ####### ◉ 统一编码风格

    把希望审查员确认的事项整理出来

    ####### ◉ 反映审查结果

    5.4.3 审查委托:作业审查篇

    ####### ◉ 准备资料
    ####### ◉ 制作作业流程文档

    5.4.4 实施审查:代码审查篇

    ####### ◉ 形式上的检查没有意义
    ####### ◉ 发现疑问就询问理由或缘由
    ####### ◉ 整理注释
    ####### ◉ 判断是否需要修正时,要考虑重要性和日程之间的平衡
    ####### ◉ 将编码能力不足和问题意识分开评价

    5.4.5 实施审查:作业审查篇

    ####### ◉ 能否跟踪作业内容和实施历史
    ####### ◉ 能否还原,是否有备份
    ####### ◉ 是否受外部因素的影响

    5.5 小结
    6 用 Mercurial 管理源码
    6.1 Mercurial 版本库的管理与设置
    6.1.1 服务器上的 Uinx 用户群设置
    6.1.2 创建版本库
    6.1.3 hgrc 的设置
    6.1.4 使用设置好的版本库
    6.1.5 使用 hgweb 建立简易中央版本库
    6.2 灵活使用“钩子”
    6.2.1 钩子功能的设置方法
    6.2.2 尝试钩子脚本
    6.2.3 钩子事件

    ####### ◉ update 时
    ####### ◉ 提交时
    ####### ◉ 从当前版本库 push/ 被其他版本库 pull 时
    ####### ◉ 向当前版本库 pull/ 被其他版本库 push 时

    6.2.4 钩子功能的执行时机
    6.2.5 编写钩子脚本

    ####### ◉ 用shell 脚本实现钩子脚本
    ####### ◉ 用 Python 脚本实现钩子脚本

    6.3 分支的操作
    6.4 关于合并
    6.4.1 未发生冲突的合并
    6.4.2 合并时发生冲突以及用文本编辑器解决冲突的方法

    ####### ◉ 查看冲突位置

    6.4.3 合并的类型与冲突
    6.4.4 用 GUI 的合并工具进行合并

    ####### ◉ KDiff3
    ####### ◉ 安装 KDiff3

    6.5 GUI 客户端
    6.5.1 GUI 客户端的介绍

    ####### ◉ TortoiseHg
    ####### ◉ SourceTree

    6.5.2 GUI 客户端的优点

    ####### ◉ 显示历史图
    ####### ◉ 工作目录的状态与差别的显示
    ####### ◉ 合并

    6.5.3 GUI 客户端的缺点
    6.6 考虑实际运用的 BePROUD Mercurial Workflow
    6.6.1 概述
    6.6.2 背景

    ####### ◉ 目标项目
    ####### ◉ 这个工作流程的相关人员
    ####### ◉ 工作环境

    6.6.3 版本库的结构

    ####### ◉ 主版本库(master)
    ####### ◉ 发布版本库(release)
    ####### ◉ 工作版本库(working)

    6.6.4 提交源码

    ####### ◉ 问题与分支

    6.6.5 提交设计

    ####### ◉ 在分支中进行设计
    ####### ◉ 伴随系统变更而产生的设计提交

    6.6.6 分支的合并

    ####### ◉ 发布时的合并
    ####### ◉ 用来追踪最新变更的合并

    6.6.7 集成分支

    ####### ◉ 创建问题
    ####### ◉ 创建集成分支

    6.7 小结
    7 完备文档的基础
    7.1 要记得给项目写文档
    7.1.1 写文档时不想做的事

    ####### ◉ 不想用写文档的专用工具
    ####### ◉ 不想编辑流水账似的单一文件
    ####### ◉ 不能用 Mercurial 等管理差别,让人生厌
    ####### ◉ WYSIWYG 工具在装饰和显示上很费时间
    ####### ◉ 不想把参考资料和程序分开写
    ####### ◉ 不想写没人看的文档

    7.1.2 什么样的状态让人想写文档
    7.2 Sphinx 的基础与安装
    7.2.1 Sphinx 的安装
    7.2.2 reStructuredText 入门
    7.2.3 用 Sphinx 写结构化文档的流程

    ####### ◉ 标题与元素
    ####### ◉ 单一文件内的结构化
    ####### ◉ 文件与目录的结构化
    ####### ◉ 网状结构
    ####### ◉ 结构化的 3 个阶段

    7.2.4 Sphinx 扩展
    7.3 导入 Sphinx 可解决的问题与新出现的问题
    7.3.1 由于是纯文本,所以能在平时用的编辑器上写文档
    7.3.2 信息与视图相分离,所以能集中精神编辑内容,不用顾虑装饰等外观问题
    7.3.3 可根据一个源码输出 PDF 等多种格式
    7.3.4 通过结构化,文档可分成几个文件来写
    7.3.5 能用 Mercurial 等轻松实现版本管理
    7.3.6 API 参考手册与程序的管理一体化
    7.3.7 通过 Web 浏览器共享
    7.3.8 导入 Sphinx 后仍存在的问题

    ####### ◉ 写有用的文档
    ####### ◉ 审查需要多花心思
    ####### ◉ 部分人只会在 WYSIWYG 编辑器上写文档
    ####### ◉ 输出 PDF 需要搭建相应的环境

    7.4 文档集的创建与使用
    7.4.1 什么是文档集
    7.4.2 项目所需文档的一览表
    7.4.3 面向项目组长、经理

    ####### ◉ 项目的目标(终点)
    ####### ◉ 体制
    ####### ◉ 需求
    ####### ◉ 日程、咨询项目表

    7.4.4 面向设计者
    7.4.5 面向开发者
    7.4.6 面向客户
    7.5 小结
    8 模块分割设计与单元测试
    8.1 模块分割设计
    8.1.1 功能设计
    8.1.2 构成 Web 应用的组件
    8.1.3 组件设计

    ####### ◉ 根据输入设计 View
    ####### ◉ 初步设计与 View 关联的 ApplicationModel
    ####### ◉ DomainModel 的设计
    ####### ◉ 关联 ApplicationModel 和 DomainModel
    ####### ◉ 整理 ApplicationModel
    ####### ◉ 从组件设计转入实现

    8.1.4 模块与程序包

    ####### ◉ 项目的文件结构

    8.2 测试
    8.2.1 测试的种类
    8.2.2 编写单元测试

    ####### ◉ unittest 模块
    ####### ◉ testfixtures 库
    ####### ◉ 通过 pytest 执行测试
    ####### ◉ 实际编写一个测试并执行
    ####### ◉ 巧用 pytest 插件
    ####### ◉ 使用 mock
    ####### ◉ 如何编写高效率的 Python 测试用例

    8.2.3 从单元测试中剔除环境依赖

    ####### ◉ 请求 / 响应
    ####### ◉ 全局请求对象
    ####### ◉ 数据库
    ####### ◉ 系统时间

    8.2.4 用 WebTest 做功能测试

    ####### ◉ WebTest
    ####### ◉ 配置器
    ####### ◉ 测试用例
    ####### ◉ 断言
    ####### ◉ 与外部服务有关的测试
    ####### ◉ 与认证和会话相关的测试

    8.3 通过测试改良设计
    便于测试的设计

    ####### ◉ 面向对象原则

    8.4 推进测试自动化
    8.4.1 用 tox 自动生成执行测试的环境
    8.4.2 可重复使用的测试环境
    8.5 小结
    9 Python 封装及其运用
    9.1 使用程序包
    9.1.1 程序包的版本指定
    9.1.2 从非 PyPI 服务器安装程序包
    9.1.3 程序包的发布格式
    9.1.4 生成wheelhouse 的方法
    9.1.5 从 wheelhouse 安装
    9.2 巧用程序包
    9.2.1 私密发布
    9.2.2 巧用 requirements.txt
    9.2.3 requirements.txt 层级化
    9.2.4 为部署和 CI+tox 准备的 requiremests
    9.2.5 通过 requirements.txt 指定库的版本
    9.3 小结
    10 用 Jenkins 持续集成
    10.1 什么是持续集成
    10.1.1 持续集成的简介

    ####### ◉ 开发流程中存在的风险
    ####### ◉ 长期开发中容易出现的问题
    ####### ◉ 一天内多构建几次能很快发现问题

    10.1.2 Jenkins 简介
    10.2 Jenkins 的安装
    10.2.1 安装 Jenkins 主体程序
    10.2.2 本章将用到的 Jenkins 插件
    10.3 执行测试代码
    10.3.1 让 Jenkins 运行简单的测试代码
    10.3.2 添加 Job

    ####### ◉ 指定源码管理系统
    ####### ◉ 制定日程表
    ####### ◉ 设置执行测试代码的命令

    10.3.3 Job 的成功与失败
    10.4 测试结果输出到报告
    10.4.1 安装 pytest
    10.4.2 调用 pytest 命令
    10.4.3 根据 pytest 更改 Jenkins 的设置
    10.5 显示覆盖率报告
    10.5.1 安装 pytest-cov
    10.5.2 从 pytest 获取覆盖率
    10.5.3 读取覆盖率报告
    10.6 执行 Django 的测试
    10.6.1 安装 Python 模块

    ####### ◉ Django 主体程序
    ####### ◉ unittest-xml-reporting
    ####### ◉ coverage

    10.6.2 Django 的调整

    ####### ◉ 创建项目目录
    ####### ◉ 创建 Django 应用

    10.6.3 示例代码

    ####### ◉ 编写模型
    ####### ◉ 编写表单
    ####### ◉ 向 settings.INSTALLED_APPS 添加 menu
    ####### ◉ 为 Jenkins 写 settings
    ####### ◉ 生成迁移文件
    ####### ◉ 编写测试代码

    10.6.4 Jenkins 的调整

    ####### ◉ 新建 Job
    ####### ◉ “源码管理系统”的设置
    ####### ◉ 在 Execute shell 中填写测试命令

    10.6.5 “构建后操作”选项卡的设置

    ####### ◉ 读取测试结果报告
    ####### ◉ 读取覆盖率报告
    ####### ◉ 查看结果
    ####### ◉ 邮件通知
    ####### ◉ 向 Slack 发送通知

    10.7 通过 Jenkins 构建文档
    10.7.1 安装 Sphinx
    10.7.2 在 Jenkins 添加 Job
    10.7.3 Sphinx 构建发出警告时令 Job 失败
    10.7.4 查看成果
    10.7.5 通过 Task Scanner Plugin 管理 TODO
    10.7.6 Task Scanner Plugin 的设置示例
    10.8 Jenkins 进阶技巧
    10.8.1 好用的功能

    ####### ◉ Job 触发器
    ####### ◉ 用户管理
    ####### ◉ 集群
    ####### ◉ CLI

    10.8.2 进一步改善
    10.9 小结

    第 3 部分 服务公开

    11 环境搭建与部署的自动化
    11.1 确定所需环境的内容
    11.1.1 网络结构

    ####### ◉ 服务器编组
    ####### ◉ 跳板服务器

    11.1.2 服务器搭建内容的结构化
    11.1.3 用户的设置
    11.1.4 选定程序包

    ####### ◉ 通过 apt-get 安装程序包
    ####### ◉ 通过 pip 安装程序包
    ####### ◉ 封闭环境中的安装

    11.1.5 中间件的设置

    ####### ◉ 让中间件设置生效的方法
    ####### ◉ mysql
    ####### ◉ nginx
    ####### ◉ gunicorn

    11.1.6 部署

    ####### ◉ 源码的安置与更新
    ####### ◉ 中间件设置的反映
    ####### ◉ 重启中间件

    11.2 用 Ansible 实现自动化作业
    11.2.1 Ansible 简介

    ####### ◉ inventory
    ####### ◉ module
    ####### ◉ role
    ####### ◉ playbook
    ####### ◉ vars

    11.2.2 文件结构

    ####### ◉ 在专用的版本库中管理
    ####### ◉ 与应用的源码放在同一个版本库中进行管理

    11.2.3 执行 Ansible
    11.2.4 与最初确定的结构相对应
    11.2.5 将各步骤 Ansible 化

    ####### ◉ playbook/role 的设计
    ####### ◉ 用户设置
    ####### ◉ deb 程序包的安装
    ####### ◉ 通过 pip 安装程序包
    ####### ◉ 中间件设置的反映
    ####### ◉ 部署
    ####### ◉ 设置的更新
    ####### ◉ 中间件的重启
    ####### ◉ 源码的更新

    11.2.6 整理Ansible 的执行环境
    11.3 小结
    12 应用的性能改善
    12.1 Web 应用的性能
    12.1.1 Web 应用面对大量集中请求时会产生哪些问题
    12.1.2 针对高负荷的对策
    12.2 评估留言板应用的性能
    12.2.1 什么是应用的性能
    12.2.2 安装 ApacheBench
    12.2.3 用 ApachBench 评估性能

    ####### ◉ Complete requests
    ####### ◉ Requests per second
    ####### ◉ Connection Times

    12.3 gunicorn 简介
    12.3.1 安装 gunicorn
    12.3.2 在 gunicorn 上运行应用
    12.4 nginx 简介
    12.4.1 安装 nginx
    12.4.2 检测nginx 的性能
    12.5 在 nginx 和 gunicorn 上运行应用
    12.5.1 gunicorn 的设置
    12.5.2 nginx 的设置
    12.5.3 评估 nginx+gunicorn 的性能
    12.5.4 性能比较
    12.6 小结

    第 4 部分 加速开发的技巧

    13 让测试为我们服务
    13.1 认识现状:测试的客观环境
    13.2 将测试导入开发各个阶段
    13.2.1 文档的测试(审查)

    ####### ◉ 未确定的事项标明“未确定”
    ####### ◉ 描述时尽量避免歧义
    ####### ◉ 明确区分最新版本和非最新版本

    13.2.2 测试设计的编写方法(输入与输出)

    ####### ◉ 明确测试的目的
    ####### ◉ 从重要的部分开始写
    ####### ◉ 利用所有可以利用的资源

    13.2.3 测试的实施与测试阶段的轮换(做什么,做多少)

    ####### ◉ 实施测试时也要有优先顺序
    ####### ◉ 问题过多时先着眼大局
    ####### ◉ 缺陷报告要简洁、详细
    ####### ◉ 即便没有测试设计,也要保证方针共享

    13.3 小结:测试并不可怕
    14 轻松使用 Django
    14.1 Django 简介
    14.1.1 Django 的安装
    14.1.2 Django 的架构

    ####### ◉ 工程
    ####### ◉ 应用
    ####### ◉ 模型
    ####### ◉ URL 分配器
    ####### ◉ 视图
    ####### ◉ 模板系统
    ####### ◉ 管理界面
    ####### ◉ 缓存系统

    14.1.3 Django 的文档
    14.2 数据库的迁移
    14.2.1 什么是数据库的迁移

    ####### ◉ 多人持续开发时
    ####### ◉ 需要在运行过程中修改数据表时

    14.2.2 Django 的迁移功能

    ####### ◉ Django 数据库迁移
    ####### ◉ 示例(对新建的应用套用迁移时)
    ####### ◉ 命令简介
    ####### ◉ 数据迁移
    ####### ◉ 迁移文件的 squash

    14.3 fixture replacement
    14.3.1 什么是测试配置器

    ####### ◉ 用 loaddata 命令读取配置器
    ####### ◉ 配置器文件的存放位置
    ####### ◉ 在 TestCase 中使用配置器
    ####### ◉ 用dumpdata 生成配置器文件

    14.3.2 几种不便使用默认配置器的情况

    ####### ◉ 日期字段会变成特定日期
    ####### ◉ 配置器不容易维护

    14.3.3 如何使用 factory_boy

    ####### ◉ Factory
    ####### ◉ 构建策略
    ####### ◉ 延迟计算属性
    ####### ◉ 序列

    14.3.4 消除“不便使用默认配置器的情况”

    ####### ◉ 解决“日期字段会变成特定日期”的问题
    ####### ◉ 解决“配置器不容易维护”的问题

    14.4 Django Debug Toolbar
    Django Debug Toolbar 的简介

    ####### ◉ 安装
    ####### ◉ 查看 Debug Toolbar
    ####### ◉ SQL
    ####### ◉ Versions
    ####### ◉ 时间
    ####### ◉ Settings
    ####### ◉ Headers
    ####### ◉ Request
    ####### ◉ Static files
    ####### ◉ Templates
    ####### ◉ Cache
    ####### ◉ Logging
    ####### ◉ Intercept redirects
    ####### ◉ 自定义显示

    14.5 小结
    15 方便好用的 Python 模块
    15.1 轻松计算日期
    15.1.1 日期计算的复杂性

    ####### ◉ “1 个月后”是哪一天
    ####### ◉ 求下个月的最后一天

    15.1.2 导入 dateutil

    ####### ◉ rrule

    15.2 简化模型的映射
    15.2.1 模型映射的必要性
    15.2.2 映射规则的结构化与重复利用
    15.2.3 导入bpmappers
    15.2.4 与 Django 联动
    15.2.5 编写JSON API
    15.3 图像处理
    15.3.1 安装Pillow

    ####### ◉ 有 wheel 可用的平台
    ####### ◉ 从源码构建

    15.3.2 图像格式转换
    15.3.3 改变图像尺寸
    15.3.4 剪裁图像
    15.3.5 对图像进行滤镜处理
    15.4 数据加密
    15.4.1 安装 PyCrypto
    15.4.2 通用加密系统的加密及解密
    15.4.3 公钥加密系统(RSA)的加密与解密

    ####### ◉ RSA 私钥和公钥的生成
    ####### ◉ 用公钥加密
    ####### ◉ 用私钥解密

    15.5 使用 Twitter 的 API
    15.5.1 导入 tweepy
    15.5.2 添加应用与获取用户密钥
    15.5.3 获取访问令牌
    15.5.4 调用 Twitter API
    15.5.5 编写用 Twitter 认证的系统
    15.6 使用REST API
    15.6.1 REST 简介
    15.6.2 导入 Requests
    15.6.3 导入测试服务器
    15.6.4 发送GET 请求
    15.6.5 发送 POST 请求
    15.6.6 发送 JSON 格式的 POST 请求
    15.6.7 使用 GET/POST 之外的 HTTP 方法
    15.7 小结

    附录

    附录 A VirtualBox 的设置

    A.1 安装VirtualBox
    A.2 新建虚拟机
    A.3 备份虚拟机

    附录 B OS(Ubuntu)的设置

    B.1 安装Ubuntu
    B.2 SSH 的设置
    B.3 中文的设置
    B.4 添加用户

    看完了

    思维导图

    Python项目开发实战第2版

    防止博客图床图片失效,防止图片源站外链:

    http://www.processon.com/chart_image/5e5b3c8de4b02bc3ad6a227b.png)

    思维导图在线编辑链接:

    https://www.processon.com/view/5e5b3c8de4b02bc3ad6a2278

  • 相关阅读:
    Vista总管注册机
    [更正]谈获取当前系统类型(SP OR PPC)
    [CallerLoc插件]SmsReply For CallerLoc (未接自动回复短信增强版)
    也谈Windows Mobile中打开/关闭WIFI
    C#实现Eval函数功能
    解决DotNetTextBox与window.history冲突!
    Vista单个程序静音带来的麻烦
    快速打开/关闭系统功能开关(CmdSwitch For SP & PPC)
    终于实现打开/关闭飞行模式了
    7.3 Hardware Prefetching 《Speculative Execution in High Performance Computer Architectures》
  • 原文地址:https://www.cnblogs.com/jingle1267/p/13084148.html
Copyright © 2020-2023  润新知