Python架构知识点大全(一)

简介: 教程来源 https://htnus.cn/category/artificial-intelligence.html 本文系统解析Python架构核心:从三层架构(用户代码→核心层→内置库→C扩展)、CPython等五大解释器,到对象模型、引用计数与分代GC、内存池机制等底层原理,助开发者深入理解运行机制,提升代码性能与可靠性。

Python作为一门高级编程语言,其架构设计体现了“优雅、明确、简单”的哲学思想。从解释器的核心实现到内存管理机制,从字节码执行到垃圾回收,Python的架构设计融合了多种经典的设计模式和技术方案。本文将系统全面地梳理Python架构的核心知识点,从解释器原理到并发模型,从内存管理到性能优化,帮助开发者深入理解Python的内部工作机制,写出更高效、更可靠的Python程序。
42acce4e-feee-4be1-b3f0-ef10e1d78aeb.png

一、Python架构概述

1.1 Python的整体架构
Python的架构可以分为三个主要层次:

┌─────────────────────────────────────────────────────────────┐
│                    Python层(用户代码)                       │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐    │
│  │  .py文件    │ │  模块/包    │ │  用户定义的类/函数   │    │
│  └─────────────┘ └─────────────┘ └─────────────────────┘    │
├─────────────────────────────────────────────────────────────┤
│                    核心层(Core)                            │
│  ┌─────────────────────────────────────────────────────┐    │
│  │                  编译器(Compiler)                   │    │
│  │  词法分析 → 语法分析 → 抽象语法树 → 字节码生成        │    │
│  └─────────────────────────────────────────────────────┘    │
│  ┌─────────────────────────────────────────────────────┐    │
│  │                  虚拟机(VM)                        │    │
│  │  字节码解释器 | 帧栈管理 | 异常处理 | 协程支持       │    │
│  └─────────────────────────────────────────────────────┘    │
│  ┌─────────────────────────────────────────────────────┐    │
│  │                  运行时(Runtime)                   │    │
│  │  对象模型 | 类型系统 | 内存管理 | 垃圾回收           │    │
│  └─────────────────────────────────────────────────────┘    │
├─────────────────────────────────────────────────────────────┤
│                     内置库层(Built-ins)                     │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐       │
│  │ 内置类型 │ │ 内置函数 │ │ 异常系统 │ │ 核心模块 │       │
│  └──────────┘ └──────────┘ └──────────┘ └──────────┘       │
├─────────────────────────────────────────────────────────────┤
│                    C语言扩展层(Extension)                   │
│  ┌─────────────────────────────────────────────────────┐    │
│  │         C API | Cython | ctypes | CFFI               │    │
│  └─────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘

1.2 Python解释器的类型

# Python有多种解释器实现

# 1. CPython - 官方参考实现(C语言编写)
# 最常用的Python解释器

# 2. PyPy - JIT编译实现(RPython编写)
# 适合长时间运行的程序
def heavy_computation():
    total = 0
    for i in range(10000000):
        total += i
    return total

# 3. Jython - Java平台实现
# 可以无缝调用Java库

# 4. IronPython - .NET平台实现
# 可以无缝调用.NET库

# 5. MicroPython - 嵌入式设备实现
# 适合资源受限的环境

1.3 Python的执行模型

# Python执行流程:源代码 → 字节码 → 虚拟机执行

import dis

def example_function(x, y):
    result = x + y
    return result

# 查看字节码
print("字节码:")
dis.dis(example_function)

# 编译为字节码
code = compile('print("Hello")', '<string>', 'exec')
print(f"\n代码对象类型: {type(code)}")
print(f"字节码: {code.co_code}")

# 执行字节码
exec(code)

# Python字节码指令示例
def loop_example(n):
    total = 0
    for i in range(n):
        total += i
    return total

print("\n循环的字节码:")
dis.dis(loop_example)

二、对象模型

2.1 Python对象体系

# Python中一切皆对象
print("对象类型层次结构:")

# 类型对象
print(f"int的类型: {type(int)}")
print(f"str的类型: {type(str)}")
print(f"list的类型: {type(list)}")

# 元类(metaclass)
class Meta(type):
    pass

class MyClass(metaclass=Meta):
    pass

print(f"MyClass的类型: {type(MyClass)}")  # <class '__main__.Meta'>

# 对象的基本结构
class Demo:
    pass

obj = Demo()
print(f"对象ID: {id(obj)}")
print(f"对象类型: {type(obj)}")
print(f"对象属性: {dir(obj)}")

# PyObject结构(C层面)
# typedef struct _object {
#     Py_ssize_t ob_refcnt;  // 引用计数
#     PyTypeObject *ob_type; // 类型指针
# } PyObject;

2.2 可变对象与不可变对象

# 不可变对象:int, float, str, tuple, frozenset
# 可变对象:list, dict, set, bytearray

# 不可变对象的行为
a = 10
b = a
print(f"a = {a}, b = {b}, a is b: {a is b}")

a += 5
print(f"a = {a}, b = {b}, a is b: {a is b}")  # a改变,b不变

# 可变对象的行为
list1 = [1, 2, 3]
list2 = list1
print(f"list1 = {list1}, list2 = {list2}, list1 is list2: {list1 is list2}")

list1.append(4)
print(f"list1 = {list1}, list2 = {list2}")  # list2也跟着改变

# 小整数缓存(-5到256)
a = 256
b = 256
print(f"256的地址相同: {a is b}")  # True

c = 257
d = 257
print(f"257的地址相同: {c is d}")  # False(CPython特性)

2.3 类型系统

# Python的鸭子类型(Duck Typing)
class Duck:
    def quack(self):
        return "嘎嘎"

    def swim(self):
        return "游泳"

class Person:
    def quack(self):
        return "模仿鸭子叫"

    def swim(self):
        return "学游泳"

def make_it_quack(obj):
    # 不检查类型,只检查行为
    return obj.quack()

duck = Duck()
person = Person()
print(make_it_quack(duck))    # 嘎嘎
print(make_it_quack(person))  # 模仿鸭子叫

# 抽象基类(ABC)
from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        return "汪汪"

class Cat(Animal):
    def make_sound(self):
        return "喵喵"

# Animal()  # TypeError: 不能实例化抽象类

# 类型注解(Type Hints)
from typing import List, Dict, Optional

def process_items(items: List[str]) -> Dict[str, int]:
    return {item: len(item) for item in items}

def find_user(user_id: int) -> Optional[Dict[str, str]]:
    if user_id == 1:
        return {"name": "张三"}
    return None

三、内存管理

3.1 引用计数

import sys

# 引用计数机制
class RefCounter:
    pass

obj = RefCounter()
print(f"初始引用计数: {sys.getrefcount(obj) - 1}")  # 减去临时引用

# 增加引用计数
ref1 = obj
ref2 = obj
print(f"添加引用后: {sys.getrefcount(obj) - 1}")

# 删除引用
del ref1
print(f"删除一个引用后: {sys.getrefcount(obj) - 1}")

# 循环引用问题
class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

# 创建循环引用
a = Node(1)
b = Node(2)
a.next = b
b.next = a

# 引用计数无法回收循环引用
del a
del b
# Node对象仍在内存中,需要垃圾回收

3.2 垃圾回收

import gc

# 分代垃圾回收
# 三代:0代(年轻代)、1代、2代(老年代)

# 查看垃圾回收阈值
print(f"垃圾回收阈值: {gc.get_threshold()}")  # (700, 10, 10)

# 手动触发垃圾回收
gc.collect()

# 监控垃圾回收
gc.set_debug(gc.DEBUG_STATS)

class WithFinalizer:
    def __del__(self):
        print(f"对象 {id(self)} 被销毁")

# 创建大量对象触发垃圾回收
objects = []
for i in range(10000):
    objects.append(WithFinalizer())

objects.clear()
gc.collect()

# 禁用垃圾回收(不推荐)
gc.disable()
# 执行代码
gc.enable()

# 查看无法回收的对象
import gc

class Circular:
    def __init__(self):
        self.self = self

circular = Circular()
circular_ref = circular
del circular

# 查看垃圾回收器中的对象
print(f"垃圾回收器中的对象数: {len(gc.get_objects())}")

3.3 内存池机制

# Python的内存管理层次:
# 1. 小块内存(< 256字节):使用内存池(arena)
# 2. 大块内存(>= 256字节):使用系统malloc

import sys
import tracemalloc

# 查看对象内存大小
small_list = [1, 2, 3]
large_list = list(range(1000))

print(f"小列表内存: {sys.getsizeof(small_list)} 字节")
print(f"大列表内存: {sys.getsizeof(large_list)} 字节")

# 内存跟踪
tracemalloc.start()

# 分配内存
data = [bytearray(1000) for _ in range(100)]

# 获取内存快照
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')

print("\n内存分配统计:")
for stat in top_stats[:5]:
    print(stat)

tracemalloc.stop()

# 对象内存布局
class Point:
    __slots__ = ('x', 'y')  # 减少内存占用
    def __init__(self, x, y):
        self.x = x
        self.y = y

class PointRegular:
    def __init__(self, x, y):
        self.x = x
        self.y = y

p1 = PointRegular(1, 2)
p2 = Point(1, 2)
print(f"普通类内存: {sys.getsizeof(p1)} 字节")
print(f"__slots__类内存: {sys.getsizeof(p2)} 字节")

来源:
https://htnus.cn/

相关文章
|
5天前
|
C++
C++函数知识点大全(三)
教程来源 http://htnus.cn/category/software-apps.html 本节详解C++函数对象(仿函数)、std::function、成员函数及友元机制:涵盖自定义函数对象(带状态/谓词/比较)、标准库预定义函数对象(plus、greater等)、std::function统一包装函数/lambda/对象;深入成员函数const属性、静态成员、指针调用;以及友元函数与友元类突破封装限制的用法。
|
5天前
|
安全 C语言 C++
C++函数知识点大全(四)
教程来源 https://xcfsr.cn/category/software-dev.html 本文系统讲解C++函数核心特性:虚函数与多态(含纯虚函数、虚析构)、虚函数表机制、异常处理(noexcept、异常安全设计)、以及函数最佳实践(const引用、移动语义、默认参数、单一职责等),涵盖从基础到高级的完整知识体系。
|
5天前
|
人工智能 Java API
【SpringAIAlibaba新手村系列】(5)Prompt 提示词基础与多种消息类型
本章详解Spring AI 1.1.2中Prompt核心机制:以System/User/Assistant/Tool四类消息构建结构化提示,强调“角色决定语义”;涵盖多模型配置、链式API与底层Message组装两种实践方式,并给出系统消息设计最佳实践。
123 7
|
5天前
|
Web App开发 安全 前端开发
基于钓鱼邮件的 DarkSword 攻击对 iOS 设备的威胁机理与防御体系研究
DarkSword是2026年3月曝光的iOS高级钓鱼攻击,利用WebKit与内核漏洞链,在iOS 18.4–18.7设备上实现无文件、静默式入侵,窃取敏感数据。本文剖析其攻击机理,提出含漏洞修补、邮件过滤、内存检测与应急响应的多层次防御方案,并提供可落地的代码实现。(239字)
232 5
|
5天前
|
数据采集 监控 JavaScript
电商效率神器!Open Claw对接1688接口,全自动监控选品教程(附完整源码)
电商人苦1688选品久矣!手动翻页、比价、盯库存,耗时易错。本文提供开箱即用方案:用Open Claw官方接口5分钟接入,无需爬虫、不惧反爬,一键获取标题、价格、SKU、库存、销量等全量数据。附完整Python代码,复制配置即可运行,支持自动监控、智能选品、批量比价,个人卖家/工作室/跨境采购皆可高效落地。(239字)
|
5天前
|
人工智能 搜索推荐 机器人
打造你的赛博女友/男友 —— AstrBot 完全指南
AstrBot 是开源全能AI聊天机器人框架,支持本地部署、多平台(微信/QQ等)、大模型接入及深度定制。主打极致隐私、人格化陪伴、情感亲密度与Agent能力,助你打造专属赛博伴侣。
247 3
|
4天前
|
人工智能 弹性计算 运维
阿里云发布 Agentic OS:首个面向 Agent 的操作系统
2026年3月,阿里云发布全球首款面向AI Agent的操作系统Agentic OS。它以“Agent为用户主体”,通过原生Skill封装、Copilot Shell交互、AgentSecCore全链路安全防护三大突破,显著降低Token消耗、提升部署效率与运行安全性,推动计算范式从“软件负载”迈向“智能体负载”。
|
4天前
|
Ubuntu API C++
OpenClaw 阿里云、本地搭建,+Windows WSL+本地源码安装与自定义修改保姆级教程
2026年OpenClaw作为灵活的AI Agent平台,不仅支持阿里云规模化部署与本地轻量运行,还能通过Windows WSL(Windows Subsystem for Linux)实现源码级安装与自定义修改——这种方式特别适合开发者学习底层逻辑、按需拓展功能,而受OpenClaw启发的超轻量级版本nanobot(仅4000行代码),更是入门源码学习的最佳选择。
196 0
|
17天前
|
JavaScript 前端开发 API
VUE前端初级新手知识大全(一)
教程来源 https://app-a6nw7st4g741.appmiaoda.com/ Vue.js是轻量、易上手的渐进式前端框架,专注视图层,支持声明式编程与MVVM模式。本文系统讲解入门知识:从CDN/CLI环境搭建、核心语法(插值、指令、ref/reactive)、响应式原理,到计算属性与侦听器,助你快速构建首个Vue应用。
|
4月前
|
安全 Java API
Java日期处理完全指南(新手也能轻松掌握的Java时间格式化与日期API教程)
教程来源https://www.vpshk.cn/本文介绍Java 8引入的java.time包,详解LocalDateTime、LocalDate等类的使用,涵盖获取当前时间、格式化、解析字符串及日期运算,助你轻松掌握现代Java日期处理方法,适合初学者快速上手。

热门文章

最新文章