12.1 并发(threading、multiprocessing、concurrent.futures、asyncio)
知识讲解
- threading:Python 的
threading
模块用于创建和管理线程。线程是轻量级的执行单元,多个线程可以在同一个进程内并发执行。例如:
import threading
def print_numbers():
for i in range(5):
print(i)
thread = threading.Thread(target=print_numbers)
thread.start()
- multiprocessing:
multiprocessing
模块允许创建和管理多个进程,每个进程有自己独立的内存空间。适用于 CPU 密集型任务。例如:
import multiprocessing
def square(x):
return x * x
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=2)
result = pool.map(square, [1, 2, 3, 4])
print(result)
- concurrent.futures:提供了高级的异步执行接口,包括线程池和进程池。例如:
import concurrent.futures
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
with concurrent.futures.ThreadPoolExecutor() as executor:
future = executor.submit(factorial, 5)
print(future.result())
- asyncio:用于编写异步 I/O 代码,通过协程实现高效的并发。例如:
import asyncio
async def hello():
print("Hello")
await asyncio.sleep(1)
print("World")
asyncio.run(hello())
武侠解读
并发就像江湖中的多线作战策略。threading
如同江湖中的多位弟子同时执行不同的小任务,他们在同一个门派(进程)内协同工作,但可能会因为资源竞争而产生冲突。multiprocessing
则像是多个门派同时开展行动,每个门派有自己的独立资源,适合大规模的战斗(CPU 密集型任务)。concurrent.futures
就像是一位武林统帅,能够灵活调配不同的作战小组(线程池或进程池)。asyncio
如同江湖中的轻功高手,在不同的任务之间快速切换,高效地完成任务,尤其擅长处理等待时间较长的任务(I/O 密集型任务)。
12.2 类型提示(PEP 484、typing、TypeVar、Protocol、Mypy)
知识讲解
- PEP 484:Python Enhancement Proposal 484 引入了类型提示的标准,允许在函数和变量上标注类型。例如:
def add(a: int, b: int) -> int:
return a + b
- typing:Python 的
typing
模块提供了各种类型注解的工具,如List
、Dict
等。例如:
from typing import List
def sum_numbers(numbers: List[int]) -> int:
return sum(numbers)
- TypeVar:用于定义泛型类型变量。例如:
from typing import TypeVar
T = TypeVar('T')
def identity(x: T) -> T:
return x
- Protocol:用于定义协议类型,类似于接口。例如:
from typing import Protocol
class Printable(Protocol):
def print(self):
...
def print_object(obj: Printable):
obj.print()
- Mypy:是一个静态类型检查工具,用于检查代码中的类型提示是否正确。
武侠解读
类型提示就像江湖中的武功秘籍上的招式说明。PEP 484 是秘籍的编写规范,规定了如何准确描述招式(函数和变量的类型)。typing
模块是秘籍中的各种符号和标记,帮助更清晰地表达招式的特点(不同的类型)。TypeVar
如同通用的招式模板,可以根据不同的情况进行变化。Protocol
就像是门派的入门要求,规定了弟子需要掌握的基本招式(接口)。Mypy 则像是门派中的教头,检查弟子的招式是否符合规范。
12.3 性能优化(timeit、cProfile、PyPy、Cython、Numba)
知识讲解
- timeit:用于测量代码的执行时间。例如:
import timeit
def test():
return [i * 2 for i in range(1000)]
print(timeit.timeit(test, number=1000))
- cProfile:用于分析代码的性能瓶颈,统计每个函数的调用次数和执行时间。例如:
import cProfile
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2)
cProfile.run('fibonacci(20)')
- PyPy:是 Python 的另一种实现,采用即时编译(JIT)技术,通常能显著提高 Python 代码的执行速度。
- Cython:允许在 Python 代码中嵌入 C 代码,从而提高代码的性能。例如:
# 假设这是一个 .pyx 文件
def add(int a, int b):
return a + b
- Numba:是一个即时编译器,专门用于加速数值计算的 Python 代码。例如:
import numba
@numba.jit(nopython=True)
def sum_array(arr):
s = 0
for i in range(len(arr)):
s += arr[i]
return s
武侠解读
性能优化就像江湖中的武功修炼,让大侠的招式更加迅猛有力。timeit
如同练功时的计时器,帮助大侠了解每次练功的时间长短。cProfile
则像是武功教练,分析大侠的招式中哪些地方消耗时间过多,需要改进。PyPy 是一种特殊的练功法门,能够让大侠在短时间内功力大增。Cython 就像是借助外部的神兵利器(C 代码)来增强自己的武功。Numba 则像是一种神秘的内功心法,专门提升大侠在数值计算方面的功力。
12.4 打包与发布(setuptools、wheel、pip、Poetry、PyPI)
知识讲解
- setuptools:是 Python 中常用的打包工具,用于创建 Python 包的分发文件。例如,在
setup.py
文件中:
from setuptools import setup
setup(
name='my_package',
version='1.0',
py_modules=['my_module'],
)
- wheel:是 Python 包的二进制分发格式,安装速度更快。可以通过
setuptools
生成 wheel 文件。 - pip:是 Python 的包管理工具,用于安装、升级和卸载 Python 包。例如:
pip install my_package
- Poetry:是一个现代化的 Python 依赖管理和打包工具,能够自动管理项目的依赖和版本。
- PyPI:Python Package Index,是 Python 包的官方仓库,开发者可以将自己的包发布到 PyPI 上供他人使用。
武侠解读
打包与发布就像江湖中的门派将自己的武功秘籍传播出去。setuptools
是秘籍的装订师傅,将门派的武功整理成可以传播的形式(包)。wheel
如同秘籍的精装版本,更易于携带和传播。pip
是江湖中的秘籍交易商,负责买卖各种秘籍。Poetry 是一位精明的门派管家,能够妥善管理门派的武功秘籍和相关资源。PyPI 则像是江湖中的秘籍大集市,汇聚了各种门派的武功秘籍,供大家挑选。
12.5 虚拟环境与依赖管理(pip-tools、pipx、conda-lock、Docker)
知识讲解
- pip-tools:用于管理 Python 项目的依赖,能够生成精确的依赖文件。例如,使用
pip-compile
生成requirements.txt
文件。 - pipx:用于在隔离的环境中安装和运行 Python 命令行工具,避免全局环境的污染。例如:
pipx install black
- conda-lock:是 Anaconda 环境的依赖锁定工具,确保环境的可重复性。
- Docker:是一个容器化平台,能够将应用程序及其依赖打包成一个独立的容器,实现跨环境的部署。例如:
# Dockerfile
FROM python:3.9
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
武侠解读
虚拟环境与依赖管理就像江湖中的门派为弟子提供独立的修炼环境。pip-tools
是门派的资源清单管理员,精确记录门派所需的各种资源(依赖)。pipx
如同为弟子提供独立的练功房,让他们在不影响其他弟子的情况下修炼特定的武功(命令行工具)。conda-lock
是门派的修炼计划锁定器,确保每次修炼的环境和资源都一致。Docker 则像是一个可移动的修炼舱,将门派的修炼环境和武功秘籍一起打包,无论走到哪里都能继续修炼。
总结
- 并发方面,
threading
、multiprocessing
、concurrent.futures
和asyncio
分别对应不同的并发策略,如同江湖中的多线作战方式。 - 类型提示通过 PEP 484、
typing
、TypeVar
、Protocol
和 Mypy 实现,类似武功秘籍的招式说明和规范检查。 - 性能优化借助
timeit
、cProfile
、PyPy、Cython 和 Numba,如同提升武功的修炼方法和工具。 - 打包与发布依靠
setuptools
、wheel
、pip
、Poetry 和 PyPI,像门派传播武功秘籍的过程。 - 虚拟环境与依赖管理使用
pip-tools
、pipx
、conda-lock
和 Docker,为项目提供独立、可重复的运行环境,如同门派为弟子提供独立修炼空间。