2025-04-20
python中的容器
2025-04-20 ~ 2025-04-20

一、容器

Python中,可包含其他对象的对象,称之为“容器”。

容器是一种数据结构。
常用的容器主要划分为两种:序列(如:列表、元祖等)和映射(如:字典)。 序列中,每个元素都有下标,它们是有序的。 映射中,每个元素都有名称(又称“ 键 ”),它们是无序的。
除了序列和映射之外,还有一种需要注意的容器——“ 集合 ”。

2025-04-20
python的一些面试题
2025-04-20 ~ 2025-04-20
2025-04-11
python yield的作用
2025-04-11 ~ 2025-04-11
在 Python 中,yield 关键字用于定义生成器函数(Generator Function),它的核心作用是实现惰性计算(Lazy Evaluation),允许函数在执行过程中暂停并保存状态,后续可以恢复执行。以下是 yield 的详细作用和典型应用场景:
2025-04-11
python中线程、协程、进程和go的goroutine的区别
2025-04-11 ~ 2025-04-11

以下是 Python 进程、线程、协程Go Goroutine 的核心区别总结,从调度方式、资源消耗、适用场景、性能表现等维度综合对比:


对比表格

特性 Python 进程 Python 线程 Python 协程 Go Goroutine
调度方式 操作系统内核调度 操作系统线程调度(受 GIL 限制) 用户态事件循环调度 Go 运行时调度(无 GIL)
资源占用 高(独立内存,MB/进程) 中(MB/线程,共享内存) 极低(KB/协程) 极低(2KB/Goroutine)
并发能力 多核并行(进程数≈CPU 核数) 单核并发(GIL 限制,无法并行) 单线程数万协程(I/O 密集型) 百万级 Goroutine(多核并行)
切换成本 高(内核切换) 高(内核切换 + GIL 竞争) 极低(用户态切换) 极低(用户态切换)
适用场景 CPU 密集型任务(如计算) 简单 I/O 任务(非高并发) 高并发 I/O(如 HTTP、RPC) 高并发 I/O + CPU 混合任务
并行能力 多核并行 单核伪并行(受 GIL 限制) 单线程异步(需多进程配合) 多核并行(默认使用所有 CPU)
通信机制 进程间通信(IPC,如管道、队列) 线程锁(Lock、RLock) 异步队列(asyncio.Queue Channel(CSP 模型,无锁通信)
代码复杂度 高(需处理进程间同步) 中(需处理线程锁和 GIL) 中(需理解异步编程模型) 低(Channel 简化并发逻辑)
生态支持 成熟(multiprocessing 成熟但受限(GIL) 依赖异步库(如 aiohttp 原生支持(标准库全异步化)
典型应用 科学计算、数据处理 简单并发任务(文件读写) Web 服务、爬虫、微服务 高并发后端、分布式系统

核心区别详解

1. 并行与并发能力

  • Python 进程:唯一绕过 GIL 的方式,适合多核 CPU 并行计算,但进程间通信(IPC)成本高。
  • Python 线程:受 GIL 限制,单核并发,适合简单 I/O 任务(如文件读写),但不适合高并发网络请求。
  • Python 协程:单线程内高并发 I/O(如处理 10k+ HTTP 连接),但无法并行利用多核。
  • Go Goroutine多核并行 + 高并发,Goroutine 由 Go 运行时自动调度到多个 CPU 核心,无 GIL 限制。

2. 资源与性能

  • 资源消耗

2025-04-05
python中进程和线程与操作系统所说的进程和线程有什么区别
2025-04-05 ~ 2025-04-05

在 Python 中,线程和进程的实现与操作系统原生概念存在显著差异,主要受 全局解释器锁(GIL) 和 Python 运行时设计的限制。以下是具体对比:


1. 线程(Thread)

操作系统线程

  • 本质:内核级线程,由操作系统直接调度,支持多核并行执行。
  • 特性
    • 线程共享进程的内存空间(堆、全局变量等)。
    • 线程切换由操作系统内核管理,开销较小。
    • 可真正并行执行(在多核 CPU 上)。

Python 线程

  • 本质:Python 的 threading 模块基于操作系统线程实现,但受 GIL 限制。
  • 关键区别
    • GIL 的存在:同一进程内的所有 Python 线程共享一个 GIL,导致 同一时刻只有一个线程能执行 Python 字节码
    • 无法真正并行:即使有多核 CPU,Python 线程在 CPU 密集型任务中只能并发(交替执行),无法并行。
    • 适用场景:I/O 密集型任务(如网络请求、文件读写),此时线程在等待 I/O 时会释放 GIL。

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import threading

def cpu_bound_task():
    # CPU 密集型任务(受 GIL 限制)
    sum(range(10**7))

# 多线程执行(实际为并发,无法加速)
threads = [threading.Thread(target=cpu_bound_task) for _ in range(4)]
for t in threads:
    t.start()
for t in threads:
    t.join()

2. 进程(Process)

操作系统进程

  • 本质:独立的内存空间和资源,由操作系统隔离管理。
  • 特性
    • 进程间通信(IPC)需通过管道、信号、共享内存等机制。
    • 进程创建和切换开销较大。
    • 不同进程的线程可并行执行在多核 CPU 上。

Python 进程

  • 本质:通过 multiprocessing 模块创建,每个进程是独立的 Python 解释器实例。
  • 关键区别
    • 绕过 GIL:每个进程有自己的 GIL,可 真正并行执行 CPU 密集型任务
    • 内存隔离:进程间不共享内存,需通过 QueuePipe 或共享内存(Value/Array)通信。
    • 适用场景:CPU 密集型任务(如数值计算、图像处理)。

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import multiprocessing

def cpu_bound_task():
    # CPU 密集型任务(多进程可并行加速)
    sum(range(10**7))

# 多进程执行(真正并行)
processes = [multiprocessing.Process(target=cpu_bound_task) for _ in range(4)]
for p in processes:
    p.start()
for p in processes:
    p.join()

3. 对比总结

特性 Python 线程 Python 进程 操作系统线程/进程
并行能力 ❌ 并发(受 GIL 限制) ✅ 并行(每个进程独立 GIL) ✅ 线程并行,进程独立运行
内存共享 ✅ 共享同一进程内存 ❌ 内存隔离,需 IPC 通信 线程共享内存,进程内存隔离
创建/切换开销 线程低,进程高
适用场景 I/O 密集型任务(如网络请求、文件读写) CPU 密集型任务(如计算、数据处理) 原生并行任务
通信机制 直接共享变量(需注意线程安全) 通过 QueuePipe 或共享内存通信 线程共享内存,进程 IPC 机制

4. 性能优化建议

  1. I/O 密集型任务

2022-11-18
go和python的区别
2022-11-18 ~ 2022-11-18

1. 设计理念

  • Go

    • 强调静态类型、编译速度和并发编程。
    • 语法简单,几乎没有语法糖,强制代码风格统一(如 gofmt)。
  • Python

    • 强调动态类型、灵活性和开发效率。
    • 语法简洁,支持多种编程范式(面向对象、函数式、过程式)。

2. 类型系统

  • Go
    • 静态类型语言,变量类型在编译时确定。
    • 类型安全,编译时检查类型错误。
    • 不支持泛型(Go 1.18 引入了泛型,但使用受限)。
  • Python
    • 动态类型语言,变量类型在运行时确定。
    • 类型灵活,但运行时可能出现类型错误。
    • 支持泛型(通过类型注解和第三方库实现)。

3. 性能

  • Go
    • 编译为机器码,执行速度快。
    • 内存管理高效,垃圾回收机制优化良好。
    • 适合高并发、高性能场景(如网络服务、微服务)。
  • Python
    • 解释执行,执行速度较慢。
    • 内存管理依赖垃圾回收,性能较低。
    • 适合开发效率优先的场景(如脚本、数据分析、原型开发)。

4. 并发模型

  • Go
    • 内置 goroutine 和 channel,支持轻量级并发。
    • goroutine 是用户级线程,开销小,适合高并发场景。
    • channel 用于 goroutine 之间的通信,避免共享内存的问题。
  • Python
    • 支持多线程、多进程和异步编程(如 asyncio)。
    • 由于全局解释器锁(GIL),多线程无法充分利用多核 CPU。
    • 多进程和异步编程是常见的并发解决方案。

5. 语法

  • Go
    • 语法简洁,强制代码风格统一。
    • 没有类和继承,通过接口和组合实现面向对象。
    • 错误处理通过返回值显式处理(如 err != nil)。
  • Python
    • 语法灵活,支持丰富的语法糖。
    • 支持类和继承,面向对象特性完善。
    • 错误处理通过异常机制(try-except)。

6. 生态系统

  • Go
    • 标准库功能强大,适合网络编程和系统编程。
    • 第三方库数量较少,但质量较高。
    • 工具链完善(如 go buildgo testgo mod)。
  • Python
    • 标准库功能丰富,涵盖多种领域。
    • 第三方库数量庞大,覆盖广泛的应用场景(如 Web 开发、数据分析、机器学习)。
    • 包管理工具多样(如 pipconda)。

7. 应用场景

  • Go
    • 网络服务(如微服务、API 服务)。
    • 系统编程(如命令行工具、操作系统组件)。
    • 高并发、高性能场景(如分布式系统、消息队列)。
  • Python
    • 数据分析与科学计算(如 Pandas、NumPy)。
    • 机器学习与人工智能(如 TensorFlow、PyTorch)。
    • Web 开发(如 Django、Flask)。
    • 脚本与自动化任务。

8. 开发效率

  • Go
    • 编译速度快,适合大型项目。
    • 代码简洁,但开发效率可能不如 Python。
  • Python
    • 开发效率高,适合快速原型开发。
    • 代码易读易写,但性能较低。

2022-10-23
python单例模式
2022-10-23 ~ 2024-12-19

单例模式

简介

单例模式是指在内存中只会创建一次对象的设计模式,在程序中多次使用同一个对象且作用相同的时候,为了防止频繁的创建对象,单例模式可以让程序在内存中创建一个对象,让所有调用者都共享这一单例对象。