Python 源码学习(2):int 类型

Python 源码学习(2):int 类型 Python 中的标准数据类型有六种,分别是 number, string, list, tuple, set, dictionary,前文已经阐述过它们的对象类型都是继承了 PyBaseObject_Type 类型的 PyType_Type 类型的实例对象,本文则主要探究 Python 中 int 类型的实现。 不同于 C 和 C++ 中的 int 类型,Python 中的 int 类型最大的特点是它一般是不会溢出的,对比用 C 和 Python 分别输出两个一百万相乘的结果: >>> x = 10000000000 >>> print(x) 10000000000 在 C 语言中会发生溢出: printf("%d\n", 1000000 * 1000000); printf("%u\n", 1000000 * 1000000); -727379968 3567587328 1 int 类型在内存中的存储方式 1.1 内存结构 Python 中的 int 整数类型实际上是一个名为 PyLongObject 的结构体,定义在 longintrepr.h 文件中: // Include/object.h #define PyObject_VAR_HEAD PyVarObject ob_base; // Objects/longobject....

March 31, 2021 · 8 min

Python 源码学习(1):类型和对象

Python 源码学习(1):类型和对象 Python 是一门解释型,动态类型,多范式的编程语言,当我们从 python.org 下载并安装运行 Python 的某个分发版本时,我们实际上是在运行由 C 语言编写的 CPython,除此之外 Python 的运行时还有 Jython, PyPy, Cython 等;CPython 的源码中有一系列的库,组件和工具: $ git clone https://github.com/python/cpython $ tree -d -L 2 . . `-- cpython |-- Doc # 文档 |-- Grammar |-- Include # C 头文件 |-- Lib # 用 Python 写的库文件 |-- Mac # 用于在 macOS 上构建的文件 |-- Misc # 杂项 |-- Modules # 用 C 写的库文件 |-- Objects # 核心类型,以及对象模型的定义 |-- PC # 用于在 Windows 上构建的文件 |-- PCbuild # 用于在老版本的 Windows 上构建的文件 |-- Parser # Python 解析器源码 |-- Programs # Python 可执行文件和其他 |-- Python # CPython 编译器源码 |-- Tools # 构建时的工具 `-- m4 16 directories 本系列主要以阅读和分析 CPython 源码的方式学习 Python。...

March 14, 2021 · 6 min

C++ 智能指针的简单实现

C++ 智能指针的简单实现 1 std::auto_ptr C++ 中经常会出现因为没有 delete 指针而造成的内存泄漏,例如有一个 Object 模板类: template<typename T> class Object { public: // constructor Object() : t_() { cout << "Object::Constructor " << this << endl; } Object(T t) : t_(t) { cout << "Object::Constructor " << this << endl; } // copy-ctor Object(const Object &other) { cout << "Object::Copy-ctor " << this << endl; } // destructor ~Object() { cout << "Object::Destructor " << this << endl; } void Set(T t) { t_ = t; } void Print() { cout << t_ << endl; } private: T t_; }; 如果在堆上为类对象分配了内存,在离开其作用域的时候又没将其释放,则会造成内存泄漏:...

February 21, 2021 · 9 min

启发式搜索和强化学习

启发式搜索和强化学习 The Pac-Man Projects 是 UC Berkeley CS 188 的课程项目,本文以该项目为例介绍启发式搜索和强化学习。 1 盲目搜索 盲目搜索(Blind Search)指不利用任何额外信息(输入数据,或辅助函数),只依赖于算法本身的搜索,例如 BFS,DFS,Dijkstra 等; DFS The Pac-Man Projects 已经实现了吃豆人游戏的后台逻辑和图形渲染框架,我们只需要在 search.py 文件中实现具体的搜索算法,并根据搜索算法生成寻路路径,即可让吃豆人移动,先来实现一个简单的 DFS: def DepthFirstSearch(problem): from util import Stack open_list = Stack() visited = [] open_list.push((problem.getStartState(), [])) while not open_list.isEmpty(): current_node, path = open_list.pop() if problem.isGoalState(current_node): return path if current_node in visited: continue visited.append(current_node) for next_node, action, cost in problem.getSuccessors(current_node): if next_node not in visited: open_list.push((next_node, path + [action])) dfs = DepthFirstSearch 在吃豆人游戏的框架下,为寻路函数传入的 problem 参数可以理解为一个 class SearchProblem 类型的抽象基类,实际的问题有 PositionSearchProblem(找到单个终点),FoodSearchProblem(找到所有食物),CapsuleSearchProblem(找到增益药丸和所有食物)等,这些子类都需要实现以下函数:...

December 10, 2020 · 9 min

C++ 闭包和匿名函数

C++ 闭包和匿名函数 本文主要介绍了 C++ 中闭包和仿函数,以及匿名函数相关的概念。 1 闭包和仿函数 闭包(Closure)可以被理解为一个附带数据的操作,WikiPedia 对闭包的定义是 “In programming languages, a closure, also lexical closure or function closure, is a technique for implementing lexically scoped name binding in a language with first-class functions.",其中有两层含义: 词法作用域(lexically scoped)的名字绑定(name binding):在词法作用域(C++ 的词法作用域是静态绑定的,包括块、函数、类、命名空间、全局作用域等)中,变量名与其词法上下文的标识符相关联,而独立于运行时的调用栈; 函数被当作头等公民(first-class citizen):在运行时可以构造一个函数对象并将其作为参数传递给其他函数; 显然 C++ 98 并不符合这两点定义,因此 C++ 98 中并没有严格意义上的闭包,但我们可以用仿函数(Functor)来模拟闭包的行为;仿函数即一个重载了小括号操作符的类,这个类拥有与函数相近的行为方式,它拥有自己的私有成员变量,例如: class Adder { public: int operator()(int num) { sum += num; return sum; } Adder() : sum(0) {} Adder(int num) : sum(num) {} private: int sum; }; int main() { Adder adder(0); cout << adder(1) << endl; cout << adder(2) << endl; cout << adder(3) << endl; } $ g++ -std=c++98 -o adder adder....

November 14, 2020 · 5 min