logging日志
一、logging日志级别(日志一共分成5个等级,从低到高排序)
- (1) DEBUG:详细的信息,通常只出现在诊断问题上
- (2) INFO:确认一切按预期运行
- (3) WARNING:一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”)。这个软件还能按预期工作。
- (4) ERROR:更严重的问题,软件没能执行一些功能
- (5) CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行
二、logging日志输出(有两种方式记录跟踪,一种输出控制台,另一种是记录到文件中,如日志文件)
- 日志输出到控制台:logging.debug(“可加字符串解释”)
- 日志输出到文件:可以将日志输出到文件,只需要在函数中设置好输出文件的文件名和写文件的模式。
三、logging日志格式说明
-
logging格式说明:
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(process)d: 打印进程ID
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(message)s: 打印日志信息 -
使用格式:
这个格式可以输出日志的打印时间,是哪个模块输出的,输出的日志级别是什么,以及输入的日志内容。format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'
垃圾回收
一、整形对象池
数值类型和字符串类型在 Python 中都是不可变的,这意味着你无法修改这个对象的值,每次对变量的修改,实际上是创建一个新的对象
-
小整形对象池
(1) 小整形对象池范围: [-5, 256]
(2) 地址相同 (有空格地址不同)
(3) 短的普通字符串 都会常驻内存 -
大整形对象池
(1) 地址不同
(2) 每一个大整数,均创建一个新的对象。 -
intern机制
(1) 单个单词,默认开启intern机制,共用对象,引用计数为0,则销毁
(2) 字符串(含有空格),不可修改,没开启intern机制,不共用对象,引用计数为0,销毁
二、计数机制
- 应用计数机制的优缺点
- 优点;
(1) 简单
(2) 实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。 - 缺点;
(1) 维护引用计数消耗资源
(2) 循环引用
- 优点;
三、GC模块
-
垃圾回收机制
(1) Python中的垃圾回收是以引用计数为主,分代收集为辅。
(2) 关闭垃圾回收gc.disable()
(3) 手动执行代码 让内存释放
gc.collect()
-
导致引用计数为+1 的情况
(1) 对象被创建,例如a=23
(2) 对象被引用,例如b=a
(3) 对象被作为参数,传入到一个函数中,例如func(a)
(4) 对象作为一个元素,存储在容器中,例如list1=[a,a] -
导致引用计数为 -1 的情况
(1) 对象的别名被显式销毁,例如del a
(2) 对象的别名被赋予新的对象,例如a=24
(3) 一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变 量不会)
(4) 对象所在的容器被销毁,或从容器中删除对象 -
导致引用计数为 0 的情况
对象的引用计数为0的时候,才会释放
-
查看一个对象的引用计数
可以查看a对象的引用计数,但是比正常计数大1,因为调用函数的时候传入a,这会让a的引用计数+1
-
触发垃圾回收的三种情况
(1) 当gc模块的计数器达到阀值的时候,自动回收垃圾
(2) 调用gc.collect(),手动回收垃圾
(3) 程序退出的时候,python解释器来回收垃圾