DeepSeek总结的使用实体-组件-系统和基于存在性处理进行Python编程简介

来源:https://root-11.codeberg.page/intro-book-python/

使用实体-组件-系统和基于存在性处理进行Python编程简介

作者: Bjorn Madsen
更新日期: 2026-05-09

在线阅读: Codeberg · GitHub Pages

克隆源码: git clone https://codeberg.org/root-11/intro-book-python.git · git clone https://github.com/root-11/intro-book-python.git

问题反馈: Codeberg · GitHub

一个课堂: 理解、建模、求解、验证、改进

本书从数据导向设计、实体-组件-系统(ECS)和基于存在性处理(EBP)的第一性原理出发,教授编程。它仅使用Python和numpy作为编程语言。

本书围绕四十三个概念(有向无环图)及其规范表述(词汇表)进行结构组织。章节短小精悍------两到三页的散文叙述,随后是四到十二个逐步深入的练习。概念仅在构建之后才被命名:每个章节通过可运行的代码赢得其词汇,而非相反。

全书的主线是一个小型生态系统模拟器,分阶段构建,从一百个游荡的生物逐步扩展到一亿个流式传输的生物。模拟器的规范位于 code/sim/SPEC

这是本书的Python版本------与同一本书的Rust版本是姊妹卷。相同的四十四个章节,相同的DAG,相同的模拟器。不同之处在于每章对Python默认行为将读者推向何处的评论,以及为什么ECS和EBP即使在使用慢速语言时也能胜出。该版本的核心论点是:ECS和EBP优于面向对象编程,因为它们处理更高效(操作集中在数组上),扩展更清晰(数据导向组合优于类图),并且内存占用更小(类型化列优于对象图)。

支撑这个版本的是证据。每一个重要的论断都附有一个测量结果,读者可以在自己的笔记本电脑上在一分钟内重现。这些示例位于 code/measurement/ 目录下,通过 uv run code/measurement/<file>.py 运行。

本书仍在编写中。章节顺序由DAG决定;阅读顺序可以是线性的(从前到后),也可以按照交叉链接随意跳转。

本书的读者对象

你上周用过Python。你写了一个类,将实例放入列表中,然后遍历它们。你的代码能运行,但比预期的慢,并且你开始怀疑标准的惯用法是否是瓶颈。

本书适合那些想找出答案的人。本书的前提是,这些惯用法确实是瓶颈------并且本书教授的架构正是Python(当它真正快的时候)所擅长的。

许多在线书籍包含一个可以在浏览器中运行代码的游乐场。本书故意不包含这种功能:测量只有当它们来自你自己的硬件时才有意义。

背景知识

你应该熟悉高中代数和命令行------运行命令、切换目录、看到错误信息时不惊慌。有一台能上网的笔记本电脑就足够了;本书使用Python 3.11+、numpy和uv进行环境管理。其他一切都使用标准库。

你不需要事先具备数值计算、并行计算或游戏开发的专业知识。本书将numpy和模拟器一起教授;语言是工具,而非主题。

初体验

在命名任何词汇之前,这里用十五行Python代码展示ECS世界的样子。一百个生物,每个都有位置和速度,模拟时间运行三十个滴答。没有类,没有实例,没有方法调用------四个步调一致的numpy数组索引,以及一个函数(每滴答的更新函数),它一次性更新所有生物。

python 复制代码
import numpy as np

n = 100
x  = np.arange(n, dtype=np.float32) * 0.1
y  = np.sin(np.arange(n, dtype=np.float32))
vx = ((np.arange(n) * 7) % 11).astype(np.float32) * 0.01 - 0.05
vy = ((np.arange(n) * 13) % 7).astype(np.float32) * 0.01 - 0.03

for tick in range(30):
    x += vx
    y += vy
    if tick % 10 == 0:
        print(f"tick {tick}: creature 17 at ({x[17]:.2f}, {y[17]:.2f})")

在本地运行它。会打印三行,然后脚本停止。这就是本书其余部分将要扩展的完整形态:表(四个数组)、一个滴答(外层循环)、一个系统(每滴答的更新函数)。后续的所有内容都是让这种相同的形态能够承载一亿个生物而不崩溃的规范。

熟悉的Python形态------一个Creature类、一个实例列表、一个step()方法------在这种规模下也能工作。但在百万级别时它就会停止工作,原因在第2节:每个生物的内存消耗增加一个数量级,每滴答的速度减慢一个数量级。本书教授的是能够经受住下一个量级扩展的布局。

运行代码

Python没有Rust Playground的等效物------没有浏览器托管的运行器能够重现章节中引用的数字。本书中的每个测量和示例都在本地运行,使用uv来管理Python工具链和环境。要运行任何代码,你需要克隆本书的仓库:

bash 复制代码
git clone https://codeberg.org/root-11/intro-book-python.git
cd intro-book-python
uv run code/measurement/cache_cliffs.py

每个 code/measurement/<name>.py 文件是一个练习组,可以独立运行。它打印出的数字是属于你的------它们来自你的硬件。练习会问"你的机器运行这个有多快?",而这个问题只有在本地才有真实的答案。

从模拟器章节(第11节及以后)开始,练习不再是独立的脚本。它们构建主线:一个Python程序,从一百个游荡的生物增长到一亿个流式传输的生物。该程序在多次运行之间保持状态,这正是uv run和项目布局为你带来的好处。

配套版本

如果你已经熟悉Python,并希望获得编译时强制执行本书通过约定教授的规范,那么Rust版本涵盖了相同的四十四个章节,使用Rust语言实现。架构相同;语言不同。许多读者发现,观察借用检查器在Rust中强制执行本书要求作为规范的约束,也是一种有用的反向校准。

相关推荐
曲幽14 小时前
FastApiAdmin 后端接口开发好了,前端管理界面怎么调用与显示?
python·vue3·api·fastapi·web·ant design·view·menu·frontend
Lhan.zzZ15 小时前
使用 ctx.lineDash 根治 QML Canvas 虚线残留问题(支持 Qt 5.12/5.14 等版本)
开发语言·qt
雨落在了我的手上15 小时前
初识java(十一):继承
java·开发语言
xier_ran15 小时前
【infra之路】从“三堵叹息之墙”到异构计算的狂飙
开发语言·c++·算法
rayyy915 小时前
神经网络模型的外推性验证
pytorch·python·深度学习
长乐呀15 小时前
数据集获取与整理
python
yaoxin52112315 小时前
417. 现代 Java IO 最佳实践 - 高效遍历、ZIP 处理与临时文件管理
java·开发语言·windows
清水白石00815 小时前
从脚本到系统:设计一个支持插件、限流、重试与监控的 Python 异步爬虫框架
网络·爬虫·python
deepin_sir15 小时前
02 - 第一个 Python 程序
开发语言·python