0
点赞
收藏
分享

微信扫一扫

Python中的并发和性能优化

棒锤_45f2 1天前 阅读 1

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()

  • multiprocessingmultiprocessing 模块允许创建和管理多个进程,每个进程有自己独立的内存空间。适用于 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 模块提供了各种类型注解的工具,如 ListDict 等。例如:

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 则像是一个可移动的修炼舱,将门派的修炼环境和武功秘籍一起打包,无论走到哪里都能继续修炼。

总结

  1. 并发方面,threadingmultiprocessingconcurrent.futuresasyncio 分别对应不同的并发策略,如同江湖中的多线作战方式。
  2. 类型提示通过 PEP 484、typingTypeVarProtocol 和 Mypy 实现,类似武功秘籍的招式说明和规范检查。
  3. 性能优化借助 timeitcProfile、PyPy、Cython 和 Numba,如同提升武功的修炼方法和工具。
  4. 打包与发布依靠 setuptoolswheelpip、Poetry 和 PyPI,像门派传播武功秘籍的过程。
  5. 虚拟环境与依赖管理使用 pip-toolspipxconda-lock 和 Docker,为项目提供独立、可重复的运行环境,如同门派为弟子提供独立修炼空间。
举报

相关推荐

0 条评论