python进阶:python高级编程技巧(中)

2023-11-04

1、通过实例方法名字的字符串调用方法

①getattr(object, name, default=None):得到一个对象中的name方法,如果没有则返回默认值
②map(func, *iterables) :第一个传递函数名称,第二个传递一个可迭代的对象,返回一个map object,转成list得以显现
③练习的例子

'''
都有一个获取图形面积的方法,但是方法名字不同,
设计一个统一的获取面积的函数,使用每种方法名进行尝试,调用相应类的接口
'''
class Rectangle:
    def __init__(self,a,b):
        self.a,self.b = a,b
    
    def getArea(self):
        return self.a * self.b
        
class Circle:
    def __init__(self,r):
        self.r = r
    
    def area(self):
        return self.r ** 2 * 3.14159

应用①②的知识可以设计出来,结果为

def get_area(shape):
    func_list = ['getArea', 'area']
    for name in func_list:
        f = getattr(shape, name, None)
        if f:
            return f()
        raise ImportError

if __name__ == '__main__':
    shape1 = Rectangle(1, 2)
    shape2 = Circle(6)
    list1 = [shape1, shape2]
    print(list(map(get_area, list1)))

2、可变与不可变的深入了解

①可变数据类型为列表(list)、字典(dict)、集合(set)
②不可变的数据类型为数字、字符串、元组
③每一个对象都是由id(内存的存储地址)、value(保存的真实数据)、type(类型)组成
④经典的参数错误,问题如图
在这里插入图片描述

解释:因为列表是可变数据类型,改变的是它的value,它的id不变,也就是储存的地址没变,而元组是不可变的数据类型,相当于重新生成了一个a

3、python内存管理

3.1前言

在 C / C++ 中,我们需要手动的进行内存管理,比如 C 语言中通过 malloc(分配内存) 和 free 函数来申请给定字节数的内存以及释放对应的内存。但在 Python 中,无须手动进行内存的申请和释放,Python 在内部完成了大量涉及到内存管理的操作,包括内存分配及垃圾回收。

3.2内存池

在 Python 中,有很多常用的数据结构,包括列表、字典等。针对这些常用对象的一系列操作,会在 Python 中造成内存的频繁分配和释放,因此 Python 在内部引入了内存池机制,实现了小块内存的管理器(称为 PyMalloc )用于提高处理小块内存的效率,这样避免了在底层频繁的 malloc 和 free 操作对效率带来的影响。

3.3缓冲池机制

在内存池机制的基础之上,Python 为了提高常用对象的创建和释放效率,又进一步对整数、字符串等对象建立了对象缓冲池。比如对于 [-5, 256] 内的小整数,Python 已经在内部创建好了对应的小整数对象的缓冲池。

4、垃圾回收机制

4.1介绍

Python 程序在运行的时候,需要在内存中开辟出一块空间,用于存放运行时产生的临时变量,计算完成后,再将结果输出到永久性存储器中。如果数据量过大,内存空间管理不善就很容易出现 OOM(out of memory),俗称爆内存,程序可能被操作系统中止。为了解决oom及时回收不用的变量,当这个对象的引用计数(指针数)为 0 的时候,则对象永不可达,自然它也就成为了垃圾,需要被回收。

4.2测试

①os模块操作系统模块,自带的模块不需要安装
②psutil与系统交互的库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要用来做系统监控,性能分析,进程管理。需要安装pip install psutil

import os
import psutil

def show_info(start):
    pid = os.getpid()     # 创建一个进程
    p = psutil.Process(pid)
    info = p.memory_full_info()
    memory = info.uss/1024./1024
    print(f"{start}一共占用{memory:.2f}MB")


def func():
    show_info("initial")
    a = [i for i in range(1000000)]   
    show_info("created")


func()
show_info("finished")

在这里插入图片描述
③当a是局部变量时,在返回到函数调用处时,局部变量的引用会注销。这时,列表a所指代对象的引用数为0,Python便会执行垃圾回收,因此之前占用的内存被收回了。
④当a是全局变量的时,即使函数体内代码执行完毕,返回到函数调用处时,对列表a的引用仍然是存在的,所以对象不会被垃圾回收,依然占有大量内存。

4.3引用计数sys.getrefcount()

import sys
a = [1,2,3]
print(sys.getrefcount(a))    

结果是2,因为它本身也算做一次引用,垃圾回收的充分非必要条件就是当对象的引用计数为0的时候

4.4循环引用

import gc
def show_info(start):
    pid = os.getpid()
    p = psutil.Process(pid)
    info = p.memory_full_info()
    memory = info.uss/1024./1024
    print(f"{start}一共占用{memory:.2f}MB")


def func():
    show_info("initial")
    a = [i for i in range(100000)]
    b = [i for i in range(100000)]
    show_info("after a,b created")
    a.append(b) # 相互引用
    b.append(a) # 相互引用

func()
gc.collect()
show_info("finished")

当双向引用的时候,即使函数结束后并不需要它,可它的引用计数还在,但我们可以手动拉起回收,进行释放内存。通过gc.clloect()对所有内存数据进行回收
在这里插入图片描述

5、用 cProfile 进行性能分析

cProfile.run(‘想要测试的模块’)

import cProfile


def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

def fib_seq(n):
    res = []
    if n > 0:
        res.extend(fib_seq(n-1))
    res.append(fib(n))
    return res

cProfile.run('fib_seq(30)')

在这里插入图片描述
①ncalls:函数被调用的次数。如果这一列有两个值,就表示有递归调用,第二个值是原生调用次数,第一个值是总调用次数。
②tottime:函数内部消耗的总时间。(可以帮助优化)
③percall:是tottime除以ncalls,一个函数每次调用平均消耗时间。
④cumtime:之前所有子函数消费时间的累计和。
⑥filename:lineno(function):被分析函数所在文件名、行号、函数名。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python进阶:python高级编程技巧(中) 的相关文章

  • LSTM的输入格式和输出个数说明

    前言 最近使用LSTM 神经网络进行预测的时候 突然发现对其输入输出不是很清晰 照着大佬们的改改还行 不能深入了解 有点难受呀 下面简单介绍一下 讨论 转换为LSTM的3D格式 samples time steps feature samp
  • python ADF检验

    前言 本文对ADF检验进行研究 python示例代码 不对概念进行分析介绍 Code import numpy as np import matplotlib pyplot as plt from statsmodels tsa statt
  • python基础十一:异常处理以及文件操作

    1 异常 1 1异常简介 程序在运行过程中可能会出现一些错误 比如 使用了不存在的索引 两个不同类型的数据相加 这些错误我们称之为异常 处理异常 程序运行时出现异常 目的并不是让我们的程序直接终止 Python是希望在出现异常时 我们可以编
  • Python——模拟退火在背包问题上的运用(详细代码)

    一 模拟退火简介 二 详细代码 import math import random import matplotlib pyplot as plt def init population n 生成一个种群 个体为全排列的随机排列 popul
  • Numpy 向量化操作加速计算,解决向量外积求和慢的问题

    在计算函数二阶导的时候 我们通常需要计算Hessian 矩阵 此时会遇到向量外积求和的问题 i 1 n u i v i u i R n 1 v i R 1 n sum i 1 n u i v i u i in mathbb R n time
  • python进阶:python高级编程技巧(上)

    1 深入类和对象 1 1鸭子类型和多态 鸭子类型多态的概念是应用于Java和C 这一类强类型语言中 而Python崇尚 鸭子类型 动态语言调用实例方法时不检查类型 只要方法存在 参数正确 就可以调用 这就是动态语言的 鸭子类型 它并不要求严
  • Python学习基础系列----了解python

    了解python 1 了解Python Python是一种解释型 这意味着开发过程中没有了编译这个环节 面向对象 支持面向对象的风格或代码封装在对象的编程技术 动态数据类型的交互式 可在命令行中通过Python提示符及直接代码执行程序 高级
  • 双向LSTM 对航空乘客预测

    前言 1 LSTM 航空乘客预测 单步预测和多步预测 简单运用LSTM 模型进行预测分析 2 加入注意力机制的LSTM 对航空乘客预测采用了目前市面上比较流行的注意力机制 将两者进行结合预测 3 多层 LSTM 对航空乘客预测 简单运用多层
  • python基础八:函数

    1 函数简介 1 1语法 语法 def 函数名 形参1 形参2 形参3 代码块 函数名 调用函数 1 2介绍 函数是个对象 function 函数用来保存一些可执行的代码 在你需要的时候可以对这些语句进行多次调用 函数中保存的代码不会立即执
  • Django安装操作教程

    一 环境准备 确保已安装好python和pycharm工具 二 django安装并配置环境变量 方法一 cmd中命令安装 pip install i https pypi douban com simple django 或 指定相应的dj
  • 多台电脑环境下Python统一相同的库及对应版本

    工作时很容易遇到这种情况 就是公司电脑和个人电脑Python中对应的库的版本甚至种类不同 这样就可能导致用个人电脑编写的代码在公司电脑上跑不了 或者别的什么原因需要统一版本库 可以通过以下方式解决 当然有别的方式 例如Docker 首先 在
  • python基础七:元组、字典、以及集合的使用

    1 元组简介 1 1元组的基本概念 元组表现形式tuple 元组是一个不可变序列 一般当我们希望数据不改变时 我们使用元组 其他情况下基本都用列表 使用 创建元素 元组不支持通过序列来修改元素 可以查找 元组不是空元组至少有一个 逗号 当元
  • [初学Python] IndentationError:unexpected indent

    在用Python实现求100以内的质数的编译程序或者说解释程序时出现了以下错误 根据编译后 解释后 的错误提示 说是num的 n 是一个IndentationError unexpected indent 什么意思呢 indentation
  • Python——beautiful,requests,歌单(多线程)

    目录 一 定义三个函数方便之后调用 1 由url获取soup函数 2 传入soup 进具体信息进行解析 3 由图片链接保存到本地 二 生产 消费主模块 精华部分 1 获取一个分类下的所有歌单的id 相当于生产者 2 对每个id 获取歌单的详
  • python基础一:计算机要点学习

    一 计算机的基本概念 1 计算机是什么 计算机是一种用于高速运算的电子机器 手机 电脑 计算器等 特点 数值计算 逻辑计算 对事物进行逻辑分析并进行判断得到的计算结果 存储记忆功能 计算机是能够按照程序运行 自动 高速处理数据的现代化电子设
  • Numpy 通过矩阵操作避免for循环 之 [None, :, :]运用

    我们知道python中 for 循环的效率是不高的 相比之下 直接运用矩阵向量操作 如点乘 可以让代码运行更快 因为在复现paper时候遇到了这样的问题 在这里总结一下我的解决方法 None 介绍 通过None indexing 可以将一个
  • Python基础教程:第一门编程语言 第6章习题3 写一个猜数字小游戏,要能提示大了还是小了,并且有轮数限制。

    import random number random choice range 101 随机抽出0 100中一个数 guess 102 n 10 while guess number if n 0 限制次数 print 游戏失败 brea
  • python基础十:模块

    1 模块简介 模块化指将一个完整的程序分解成一个个的小模块 通过将模块组合 来搭建出一个完整的程序 模块化的优点 方便开发 方便维护 模块可以复用 2 模块的创建 在Python当中一个py文件就是一个模块 在一个模块中引入外部模块 imp
  • Python——协程(Coroutine),异步IO

    目录 生成器 Generator yield表达式的使用 生产者和消费者模型 编辑 yield from表达式 协程 Coroutine asyncio coroutine async await 总结 由于GIL的存在 导致Python多
  • python基础六:列表

    1 序列 1 1基本概念 序列就是python中最基本的一种数据结构 用于保存一组有序的数据 所有的数据在序列当中都会有唯一的一个位置 索引 与之对应 并且序列会按照数据添加的顺序来分配索引 1 2序列的分类 可变序列 序列中的元素可以改变

随机推荐

  • Nginx web应用服务器部署

    前端项目部署通常会选择一些轻量级的Web服务器 如Apache Nginx等 下面以Nginx为例介绍如何部署前端项目 安装Nginx 可以在官网上下载对应版本的Nginx 然后按照官方文档进行安装 配置Nginx Nginx的配置文件在
  • sqlite3_column

    此文档的原文地址为为 https www sqlite org c3ref column blob html 通常 我们都会判断sqlite3 step pStmt 的返回值是否等于SQLITE ROW来判断是否继续执行sqlite3 st
  • 分布式文件系统(FastDFS原理介绍)

    分布式文件系统 FastDFS原理介绍 在生产中我们一般希望文件系统能帮我们解决以下问题 如 1 超大数据存储 2 数据高可用 冗余备份 3 读 写高性能 4 海量数据计算 最好还得支持多平台多语言 支持高并发 由于单台服务器无法满足以上要
  • MacBook M1 使用 brew 安装 JDK/Redis/MySQL5.7(Pouring openssl@1.1-1.1.1k.arm64_big_sur.bottle.tar.gz)报错解决

    brew 安装 MySQL Redis Maven 报错 还没有安装 brew 的 看这里 使用 brew 安装环境报错信息如下 gt Pouring openssl 1 1 1 1 1k arm64 big sur bottle tar
  • 3dmax渲染计算机内存不足怎么办,解决3dmax渲染内存不够导致渲染失败的三种方法...

    3dmax渲染内存不够导致渲染失败应该怎么解决 在使用3dmax渲染效果图的过程之中 如果弹窗提示3dmax渲染内存不足 导致无法渲染或者渲染失败 这种情况我们要怎么办呢 本期 就来和模型云一起看看3dmax提示渲染内存不够导致渲染失败的三
  • 2021年电工杯数学建模A题高铁牵引供电系统运行数据分析及等值建模求解全过程论文及程序

    2021年电工杯数学建模 A题 高铁牵引供电系统运行数据分析及等值建模 原题再现 我国是世界上电气化铁路运营里程最长 服役电力机车型号最多 运营最繁忙的国家 截至 2020 年底 我国铁路年消耗电量约 800 亿千瓦时 约占三峡年总发电量的
  • node.js详解+案例

    系列文章目录 提示 node基础 系统模块 第三方模块 node js 对数据库的操作 增删改查 使用node实现对列表简单的增删改查功能 博客项目连接数据库 博客项目前端 文章目录 系列文章目录 前言 一 node js 是什么 二 No
  • web html做菜单,Web元素设计之导航菜单

    1 横向导航菜单 导航菜单实际上相当于一个列表 自然地 我们可以选择HTML中的列表元素ul来进行实现 HTML 首页 探索 观察 解密 关于 ul本身是一个块级元素 其中包含的列表项li同样也是块级元素 所以要实现横向菜单 我们需要使用到
  • Apache-ant 使用总结

    文章目录 指定特定的 jdk 指定特定的 jdk
  • 【STM32】STM32CUBEMX + ADC(单通道,双通道DMA)

    STM32CUBEMX ADC 单通道 双通道DMA 案例应用 使用ADC采集电压 单通道 单通道 DMA 双通道 DMA 并利用串口打印采集转换后的电压值 1 工具 IAR STM32CUBEMX 开发板STM32F411VET6 预备知
  • 读取云服务器文件列表,读取云服务器文件列表

    读取云服务器文件列表 内容精选 换一换 当卸载数据盘时 支持离线或者在线卸载 即可在挂载该数据盘的云服务器处于 关机 或 运行中 状态进行卸载 弹性云服务器在线卸载磁盘 详细信息请参见在线卸载磁盘 裸金属服务器当前支持将SCSI类型磁盘挂载
  • nginx 神奇的斜线,各种斜线的搭配访问结果

    两台服务器 一台客户端 服务器B1 192 168 1 1 服务器B2 192 168 2 2 客户端C1 127 0 0 1 1 代理模式 在客户端中请求服务器B1 请求路径为 http 192 168 1 1 test api B1 配
  • 计算机条件格式设置方法,excel怎样利用条件格式把

    2013 09 08 怎么设置excel复制默认复制文本 谁知道 可以分几种情况来解决 1 如果是从文本文件复制过来 可以利用EXCEL的外部数据导入功能 点击菜单数据 导入外部数据 导入数据 在打开的对话框中 把文件类型选择为 所有文件
  • docker好难用啊!为啥说它移植性好?

    刚刚接触docker 真的好麻烦啊 不明白为什么要选择docker 我都搞了两天还在搭环境 又告诉我Windows版本过低不适配docker 转而在Ubuntu里装docker 然后MySQL php Nginx又得重新装一遍 好麻烦啊 1
  • C++基础知识 - STL(标准模板库)

    STL主要分为分为三类 algorithm 算法 对数据进行处理 解决问题 步骤的有限集合 container 容器 用来管理一组数据元素 Iterator 迭代器 可遍历STL容器内全部或部分元素 的对象 容器和算法通过迭代器可以进行无缝
  • 软件测试面试题:有验证码的功能,怎么做性能测试?

    有验证码的功能 怎么做性能测试 1 将验证码暂时屏蔽 完成性能测试后 再恢复 2 使用万能的验证码 个人简介 我是一名测试兼开发工程师 目前25K 目前做的是无人驾驶 欢迎和大家一起交流测试技术 一起高薪就业 我们还有一起打妖怪的群哦 还有
  • hdu 1050 Moving Tables

    http acm hdu edu cn showproblem php pid 1050 简单的题目 就是求交叉的路线最多次数 注意 房间可能从大到小 也可能从小到大 1和2属于同一个 2和3也是 等等 include
  • 将桌面文件映射至E盘

    打开 计算机 gt Administrator gt 桌面 DOS添加盘符 不是真实存在的 subst H C 123subst 为创建的意思H 为盘符C 123为C盘下的文件subst H d为删除盘符H Windows7中有一个问题记录
  • linux之安装java教程,一看就会

    一 第一种 1 直接用yun安装jdk yum install java 1 8 0 openjdk x86 64 2 执行完直接直接查看版本就好了 java version 二 第二种 1 进入下载目录 cd usr local src
  • python进阶:python高级编程技巧(中)

    1 通过实例方法名字的字符串调用方法 getattr object name default None 得到一个对象中的name方法 如果没有则返回默认值 map func iterables 第一个传递函数名称 第二个传递一个可迭代的对象