广告
返回顶部
首页 > 资讯 > 后端开发 > Python >2. Python3源码—浮点对象
  • 244
分享到

2. Python3源码—浮点对象

浮点源码对象 2023-01-31 08:01:25 244人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

2.1. 浮点对象 浮点对象是“定长对象”。 2.1.1. Python中的创建 python中浮点对象创建最重要的方法为PyFloat_FromDouble,如下Python语句最终会调用到PyFloat_FromDouble: a =

2.1. 浮点对象

浮点对象是“定长对象”。

2.1.1. Python中的创建

python中浮点对象创建最重要的方法为PyFloat_FromDouble,如下Python语句最终会调用到PyFloat_FromDouble:

a = 1.23
b = float(1.234)

2.1.2. PyFloat_FromDouble的C调用栈

词法解析,最终调到PyFloat_FromDouble,调用顺序如下:

// ast.c
ast_for_expr
=>ast_for_power
=>ast_for_atom_expr
=>ast_for_atom (case NUMBER)
=>parsenumber
=>parsenumber_raw

// floatobject.c
=> PyFloat_FromDouble

2.1.3. PyFloat_FromDouble的C源码

// floatobject.c
PyObject *
PyFloat_FromDouble(double fval)
{
    PyFloatObject *op = free_list;
    if (op != NULL) {
        free_list = (PyFloatObject *) Py_TYPE(op);
        numfree--;
    } else {
        op = (PyFloatObject*) PyObject_MALLOC(sizeof(PyFloatObject));
        if (!op)
            return PyErr_NoMemory();
    }
    
    (void)PyObject_INIT(op, &PyFloat_Type);
    op->ob_fval = fval;
    return (PyObject *) op;
}

可以看到:

  • 浮点对象的C数据结构,所以Python中的浮点对象,实际上是C中的double。
// floatobject.h
typedef struct {
    PyObject_HEAD
    double ob_fval;
} PyFloatObject;
  • 采用浮点对象缓冲池
// floatobject.c
#ifndef PyFloat_MAXFREELIST
#define PyFloat_MAXFREELIST    100
#endif
static int numfree = 0;
static PyFloatObject *free_list = NULL;

static void
float_dealloc(PyFloatObject *op)
{
    if (PyFloat_CheckExact(op)) {
        if (numfree >= PyFloat_MAXFREELIST)  {
            PyObject_FREE(op);
            return;
        }
        numfree++;
        Py_TYPE(op) = (struct _typeobject *)free_list;
        free_list = op;
    }
    else
        Py_TYPE(op)->tp_free((PyObject *)op);
}

PyObject *
PyFloat_FromDouble(double fval)
{
    PyFloatObject *op = free_list;
    if (op != NULL) {
        free_list = (PyFloatObject *) Py_TYPE(op);
        numfree--;
    } else {
        op = (PyFloatObject*) PyObject_MALLOC(sizeof(PyFloatObject));
        if (!op)
            return PyErr_NoMemory();
    }
    
    (void)PyObject_INIT(op, &PyFloat_Type);
    op->ob_fval = fval;
    return (PyObject *) op;
}

float_dealloc和PyFloat_FromDouble方法针对free_list和numfree的操作构成了Python的浮点对象缓冲池技术。采用链表,值得注意的是Py_TYPE(op),在此处被当做next指针。缓冲池大小有上限,python3中为100。

  • PyObject_INIT

    因为是定长对象,所以调用PyObject_INIT方法,与PyObject_INIT_VAR方法相比,只是少调用Py_SIZE(op) =(size)

2.2. 浮点对象的特性

2.2.1. 数值计算

// floatobject.c
&float_as_number,                           

浮点对象的数值计算由float_as_number定义:

// floatobject.c
static PyNumberMethods float_as_number = {
    float_add,          
    float_sub,          
    float_mul,          
    float_rem,          
    float_divmod,       
    float_pow,          
    (unaryfunc)float_neg, 
    float_float,        
    (unaryfunc)float_abs, 
    (inquiry)float_bool, 
    0,                  
    0,                  
    0,                  
    0,                  
    0,                  
    0,                  
    float___trunc___impl, 
    0,                  
    float_float,        
    0,                  
    0,                  
    0,                  
    0,                  
    0,                  
    0,                  
    0,                  
    0,                  
    0,                  
    0,                  
    float_floor_div,    
    float_div,          
    0,                  
    0,                  
};

2.2.2. to string

// floatobject.c
(reprfunc)float_repr,                       
(reprfunc)float_repr,                       

2.2.3. hash

// floatobject.c
(hashfunc)float_hash,                       

2.2.4. 比较

// floatobject.c
float_richcompare,                        

2.2.5. 内置方法

// floatobject.c
float_methods,                              

2.2.6. 内置属性

// floatobject.c
float_getset,                                

2.3 参考

本文作者:whj0709
阅读原文
本文为云栖社区原创内容,未经允许不得转载。

--结束END--

本文标题: 2. Python3源码—浮点对象

本文链接: https://www.lsjlt.com/news/193413.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 2. Python3源码—浮点对象
    2.1. 浮点对象 浮点对象是“定长对象”。 2.1.1. Python中的创建 Python中浮点对象创建最重要的方法为PyFloat_FromDouble,如下Python语句最终会调用到PyFloat_FromDouble: a =...
    99+
    2023-01-31
    浮点 源码 对象
  • 1. Python3源码—内建对象
    1.1. Python内的对象 Python中的类和实例都是通过Python内的对象来实现的。Python中已经预先定义了一些类型对象。这些内建类型对象通过实例化,可以创建内建类型对象的实例对象。 在Python中,对象就是为C中的结构体...
    99+
    2023-01-31
    内建 源码 对象
  • Python源码:str对象
    class str(object):     """     str(object='') -> str     str(bytes_or_buffer[, encoding[, errors]]) -> str        ...
    99+
    2023-01-31
    源码 对象 Python
  • Python3面向对象—点和矩形类
    Python类练习 定义一个类 class Point: '''二维坐标系中代表一个点''' pass print('打印Point:{}'.format(Point)) p1 = Point() print('Point...
    99+
    2023-01-30
    矩形 面向对象
  • Python万物皆对象源码分析
    这篇文章主要讲解了“Python万物皆对象源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python万物皆对象源码分析”吧!万物皆对象这篇博客的内容主要是针对Python中万物皆对象...
    99+
    2023-06-30
  • Android悬浮对话框(即点即关对话框)实现代码
    Activity是Android系统的4个应用程序组件之一。通过传统方法显示的Activity都是充满整个屏幕,也就是全屏的Activity。事实上,Activity不仅可以全...
    99+
    2022-06-06
    Android
  • 如何理解Java SynDemo对象源代码
    本篇文章为大家展示了如何理解Java SynDemo对象源代码,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java SynDemo对象一直在我们的语言使用中使用,其实在不断的学习中我们还是在源代码...
    99+
    2023-06-17
  • Python对象的生命周期源码学习
    目录思考:1 C API2 对象的创建2.1 两种创建对象的方式2.2 由类型对象创建实例对象3 对象的多态性4 对象的行为5 引用计数思考: 当我们输入这个语句的时候,Python...
    99+
    2022-11-11
  • Python对象的底层实现源码学习
    目录1. PyObject:对象的基石2. PyVarObject:变长对象的基础2.1 浮点对象2.2 列表对象3. PyTypeObject:类型的基石4. PyType_Typ...
    99+
    2022-11-11
  • Python对象的生命周期源码分析
    本篇内容介绍了“Python对象的生命周期源码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!思考:当我们输入这个语句的时候,Python...
    99+
    2023-06-30
  • Redis对象与redisObject超详细分析源码层
    目录一、对象二、对象的类型及编码RedisObject 结构体三、不同对象编码规则四、redisObject结构各字段使用范例4.1 类型检查(type字段)4.2 多态命令的实现(encoding)4.3 内存回收和共...
    99+
    2022-11-28
    Redis对象 RedisredisObject RedisredisObject源码
  • Python万物皆对象理解及源码学习
    目录万物皆对象1 类型对象和实例对象2 类型、对象体系2.1 元类型type2.2 自定义类型2.3 自定义类型子类2.4 type和object的关系3 可变对象与不可变对象4 变...
    99+
    2022-11-11
  • 深入源码解析Python中的对象与类型
    对象 对象, 在C语言是如何实现的? Python中对象分为两类: 定长(int等), 非定长(list/dict等) 所有对象都有一些相同的东西, 源码中定义为PyObject和PyVarObje...
    99+
    2022-06-04
    源码 对象 类型
  • Python虚拟机栈帧对象及获取源码学习
    目录Python虚拟机1. 栈帧对象1.1 PyFrameObject1.2 栈帧对象链1.3 栈帧获取2. 字节码执行Python虚拟机 注:本篇是根据教程学习记录的笔记,部分内...
    99+
    2023-03-23
    Python虚拟机栈帧对象获取 Python虚拟机
  • 源码分析系列之json_encode()如何转化一个对象
    目录初步测试JsonSerializable源码分析分析Demojson_encode()如何转化一个对象? 使用 json_encode() 将数组 ...
    99+
    2022-11-12
  • 基于java构造方法Vector创建对象源码分析
    (注意:本文基于JDK1.8)  前言 Vector是线程安全的动态数组类,提供4个创建Vector对象的构造方法,接下来我们逐个分析每个创建Vector对象的构造方法 ...
    99+
    2022-11-12
  • 如何用JVM源码分析Java对象的创建过程
    这篇文章将为大家详细讲解有关如何用JVM源码分析Java对象的创建过程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。基于HotSpot实现对Java对象的创建过程进行深入分析。定义两个简单的...
    99+
    2023-06-17
  • Netty分布式获取异线程释放对象源码剖析
    目录获取异线程释放对象在介绍之前我们首先看Stack类中的两个属性我们跟到pop方法中继续跟到scavengeSome方法中我们继续分析transfer方法接着我们我们关注一个细节我...
    99+
    2022-11-13
  • 从源码解析Python的Flask框架中request对象的用法
    from flask import request Flask 是一个人气非常高的Python Web框架,笔者也拿它写过一些大大小小的项目,Flask 有一个特性我非常的喜欢,就是无论在什么地方,如果你想...
    99+
    2022-06-04
    源码 框架 对象
  • SpringBoot启动流程入口参数创建对象源码分析
    目录入口探讨primarySource参数args参数创建对象1、推断web应用类别2、加载Spring应用上下文初始化3、加载Spring应用事件监听器4、推断应用引导类入口 这...
    99+
    2023-05-14
    SpringBoot 启动参数创建 SpringBoot 启动
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作