Python Tips(Python小知识点)

本文详细介绍了Python中的logging模块,包括其线程安全性、继承关系、性能考量及常见问题解决方案等内容,帮助开发者更好地理解和使用该模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文没有固定的主题,都是在开发过程中总结发现的一些tips,写在这里,一方面是做笔记,另一方面也希望能帮到他人(持续更新)。

1、logging模块

1.1 python的logging模块是线程安全的

python的logging模块是线程安全的,多个线程调用同一个Logger对象打印日志并不会造成混乱。他的线程安全是通过锁机制来维护的,在handler对象中定义了一个threading.RLock对象保证同一时刻只有一个线程写文件(所有的handler都是logging.Handler的子类,这个所对象是在logging.Handler中定义的)。需要注意的是,python的logging模块不是进程安全的,如果多个进程访问,则会出现打印到一起的现象。如果需要使用进程安全的日志,可以使用multiprocessing模块提供的get_logger()方法获取日志对象打印日志。

1.2 关于logger的继承关系

python中logger的继承关系是根据名字来确定的。例如,名为"a.b"的logger是名为"a"的logger的子logger,而所有的logger都有一个公共的祖先,名为root。默认情况下,logger默认会进行消息传递的,也就是说如果level允许,一个消息会传递给所有存在的父logger进行打印,root logger默认初始化为错误流打印。这有可能会引发一个问题:假如你定义的logger打印的消息等级在root中也允许,那么这个消息在打印你自己的logger的同时,也会打印到root logger。避免这个问题的方法就是设置logger的propagate属性为0,关闭递归。

1.3 关于logger的性能

这里只针对FileHandler进行说明,logging中的FileHandler是继承自StreamHandler的。在后者中,每写一条记录,就会调用flush()方法写入,也就是说对于FileHandler,每写一条记录都会访问一次磁盘,这对于大数据量开销是很大的。所以,在大量数据的时候,最好将多条记录拼接成一条进行写入。另外,由于handler是采用锁机制解决多线程问题,所以如果访问logger的线程特别多,也很有可能造成性能瓶颈,多线程写入不一定会比单线程要快(我当时处理的是大概每秒钟要写1w-2w多次,单线程测试的时候应该没啥问题,可后来系统上线之后,发现性能下降了很多,hold不住了,后来发现是多线程竞争锁导致性能的下降。最后改成了多进程,单个进程来写文件)。

1.4 关于logger的其他说明

logging模块有一个raiseExceptions属性来控制是否打印异常,默认情况下,raiseExceptions=1会将异常打印至stderr(logging.Handler中实现)。logger中最容易出现的错误就是编码错误,尤其是当数据来源不受控的时候。默认情况下,FileHandler使用utf-8编码,会尝试将输入的所有东西转化为utf-8编码,如果转码失败,就会将这个异常打印纸stderr(如果raiseExceptions=1)。当然,FileHandler的编码是可以设置的。但是,所以,在使用FileHandler或者其子类的时候,尽量将传入内容转化为想要的编码(编码问题下面会讲到,我当时就是因为编码问题,大量日志直接打入了错误流,相当郁闷)。

1.5 最好的老师就是源码

想要深入了解,最好就是自己去看一下源码,其实也不多logging模块    logging.handler模块


头晕了,今天先写到这里,明天再继续更。。。。。。。。。。。。。

### Python 数据分析的关键概念 #### 1. Pandas 库的核心功能 Pandas 提供了高效的数据结构和数据分析工具,特别是 DataFrame 和 Series 对象。DataFrame 类似于电子表格或 SQL 表格,能够存储多列不同类型的数值型、字符型或其他类型的数据[^1]。 ```python import pandas as pd data = {'Name': ['Tom', 'Jack', 'Steve'], 'Age': [28, 34, 29]} df = pd.DataFrame(data) print(df) ``` #### 2. NumPy 数组操作 NumPy 是科学计算的基础包,在 Python 的数据分析中扮演着重要角色。它提供了强大的 N 维数组对象 ndarray 及大量用于处理这些数组的函数。 ```python import numpy as np arr = np.array([1, 2, 3]) mean_value = np.mean(arr) print(mean_value) ``` #### 3. Matplotlib 图表绘制 Matplotlib 是一个非常流行的绘图库,可以创建静态、动态以及交互式的可视化图形。通过简单的 API 接口即可实现多种图表样式定制化需求。 ```python import matplotlib.pyplot as plt plt.plot([1, 2, 3], [4, 5, 6]) plt.show() ``` #### 4. Seaborn 高级统计图表 Seaborn 基于 Matplotlib 构建而成,专注于统计数据集的美观展示。内置了许多主题风格设置选项来美化默认外观,并简化复杂关系表达方式。 ```python import seaborn as sns sns.set_theme(style="darkgrid") tips = sns.load_dataset("tips") sns.relplot(x="total_bill", y="tip", data=tips); ``` #### 5. 缺失值处理方法 真实世界中的数据往往存在缺失情况,因此掌握如何识别、填充或删除含有 NA/NaN 的记录对于保持模型准确性至关重要。 ```python # 使用 fillna 方法替换 NaN 值 df['column'].fillna(value=0, inplace=True) # 或者 dropna 删除包含任何 nulls 的行 cleaned_df = df.dropna(how='any') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值