我的编程空间,编程开发者的网络收藏夹
学习永远不晚

2. Python3源码—浮点对象

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

2. Python3源码—浮点对象

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 参考

  • Python源码剖析

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

2. Python3源码—浮点对象

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

下载Word文档

猜你喜欢

2. Python3源码—浮点对象

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

1. Python3源码—内建对象

1.1. Python内的对象Python中的类和实例都是通过Python内的对象来实现的。Python中已经预先定义了一些类型对象。这些内建类型对象通过实例化,可以创建内建类型对象的实例对象。在Python中,对象就是为C中的结构体在堆上
2023-01-31

Python源码:str对象

class str(object):    """    str(object='') -> str    str(bytes_or_buffer[, encoding[, errors]]) -> str        Create a 
2023-01-31

Python3面向对象—点和矩形类

Python类练习定义一个类class Point: '''二维坐标系中代表一个点''' passprint('打印Point:{}'.format(Point))p1 = Point()print('Point实例化为一个p1
2023-01-30

Python万物皆对象源码分析

这篇文章主要讲解了“Python万物皆对象源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python万物皆对象源码分析”吧!万物皆对象这篇博客的内容主要是针对Python中万物皆对象
2023-06-30

如何理解Java SynDemo对象源代码

本篇文章为大家展示了如何理解Java SynDemo对象源代码,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java SynDemo对象一直在我们的语言使用中使用,其实在不断的学习中我们还是在源代码
2023-06-17

Android悬浮对话框(即点即关对话框)实现代码

Activity是Android系统的4个应用程序组件之一。通过传统方法显示的Activity都是充满整个屏幕,也就是全屏的Activity。事实上,Activity不仅可以全屏显示,还可以象对话框一样直接显示在屏幕上。而且可以通过单击屏幕
2022-06-06

Python对象的生命周期源码分析

本篇内容介绍了“Python对象的生命周期源码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!思考:当我们输入这个语句的时候,Python
2023-06-30

Redis对象与redisObject超详细分析源码层

目录一、对象二、对象的类型及编码RedisObject 结构体三、不同对象编码规则四、redisObject结构各字段使用范例4.1 类型检查(type字段)4.2 多态命令的实现(encoding)4.3 内存回收和共享对象(refcou
2022-11-28

深入源码解析Python中的对象与类型

对象 对象, 在C语言是如何实现的 Python中对象分为两类: 定长(int等), 非定长(list/dict等) 所有对象都有一些相同的东西, 源码中定义为PyObject和PyVarObject, 两个定义都有一个共同的头部定义PyO
2022-06-04

Python虚拟机栈帧对象及获取源码学习

这篇文章主要为大家介绍了Python虚拟机栈帧对象及获取源码学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-23

如何用JVM源码分析Java对象的创建过程

这篇文章将为大家详细讲解有关如何用JVM源码分析Java对象的创建过程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。基于HotSpot实现对Java对象的创建过程进行深入分析。定义两个简单的
2023-06-17

SpringBoot启动流程入口参数创建对象源码分析

这篇文章主要为大家介绍了SpringBoot启动流程入口参数研究及创建对象源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-14

从源码解析Python的Flask框架中request对象的用法

from flask import request Flask 是一个人气非常高的Python Web框架,笔者也拿它写过一些大大小小的项目,Flask 有一个特性我非常的喜欢,就是无论在什么地方,如果你想要获取当前的request对象,只
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录