Python API

Python

Posted by Treaseven on January 7, 2025

hasattr(): 接受两个参数(第一个是对象,第二个是要检查的属性名),返回一个布尔值

multiprocessing库
Process类
p = Process(target=func, args=(arg1,)) # 创建进程
p.start() # 启动进程
p.join() # 等待进程结束
p.terminate() # 终止进程
p.is_alive() # 检查进程是否在运行

Pool类
pool = Pool(process=4) # 创建进程池
pool.map(func, iterable) # 并行映射
pool.apply_async(func, args) # 异步执行
pool.close() # 关闭进程池
pool.join() # 等待所有进程完成

进程间通信工具
from multiprocessing import Queue # Queue用于进程间数据传递
q = Queue()
q.put(item) # 放入数据
q.get() # 获取数据

from multiprocessing import Pipe # Pipe用于两个进程间通信
parent_conn, child_conn = Pipe()
parent_conn.send(data) # 发送数据
child_conn.recv() # 接收数据

同步原语
from multiprocessing import Lock # Lock用于进程同步
lock = Lock()
lock.acquire() # 获取锁
lock.release() # 释放锁

from multiprocessing import Event # Event用于进程间事件通知
event = Event()
event.set() # 设置事件
event.clear() # 清除事件
event.wait() # 等待事件

共享内存
from multiprocessing import Value, Array
num = Value('i', 0) # 共享整数
arr = Array('i', range(10)) # 共享整数数组

常用属性和函数
import multiprocessing as mp
mp.cpu_count() # 获取CPU核心数
current = mp.current_process() # 当前进程
current.name # 获取进程名称
current.pid # 获取进程id
mp.set_start_method('spawn') #设置启动方法 ‘fork’、‘forkserver’

signal信号处理函数
signal.signal(signal.SIGINT, signal_handler): signal.SIGINT表示中断信号,signal_handler表示处理该信号的函数,当信号被捕获时会调用这个函数

线程类
import threading
threading.Thread(target, args, kwargs, daemon): target要在线程中执行的函数,args传递给目标函数的位置参数,以元组形式提供,kwargs传递给目标函数的关键字参数,以字典形式提供,dameon布尔值,执行线程是否为守护线程(当主线程退出时,守护线程会自动终止)
方法
start(): 启动线程,开始执行
join([timeout]): 等待线程完成或超时
is_alive(): 检查线程是否执行
run(): 定义线程的活动,通常在继承Thread类重写

parent=psutil.Process(pid)创建一个表示特定进程的Process对象,其中pid是一个整数,表示进程的标识符
创建Process对象后,可以通过它访问该进程的各种信息和操作该进程:
parent.children(recursive=True)-获取所有子进程
parent.send_signal(sig)-向进程发送信号
parent.terminate()-终止进程
parent.kill()-强制终止进程
parent.cpu_percent()-获取CPU使用率
parent.memory_info()-获取内存使用情况

psutil.NoSuchProcess是psutil库中定义的一个异常类,当尝试访问不存在的进程时,会抛出这个异常

python的装饰器是一种在不修改原始函数或类定义的情况下,增加额外功能的方法
@functools.wraps(func) 保留原函数的元信息
*args 和 **kwargs 是python中用于处理可变数量参数的特殊语法
*args: 用于收集位置参数到一个元组中
**kwargs: 用于收集关键字参数到一个字典中
@abstractmethod: python中的一个装饰器,用于声明抽象方法,来自abc(Abstract Base Classes)模块,用于定义接口或抽象类中的抽象方法,这些方法必须在子类中实现
@staticmethod: python中的一个装饰器,用于定义静态方法,是一种特殊的方法,它不需要访问类或实例的属性,可以直接通过类名调用
@classmethod: python中的一个装饰器,用于定义类方法,类方法的第一个参数是类本身(通常命名为cls),而不是实例(self),使得方法可以访问和修改类的状态,而不需要创建类的实例
from memory_profile import profile @profile 分析函数的内存使用
from memory_profiler import memory_usage 实时内存监控功能
from scipy import stats  stats.trim_mean(a, proportiontocut, axis=0) 用于计算修剪平均值,会去除数据两端的极端值
@property: python中的一个装饰器,可以让一个方法像属性一样被访问,同时可以添加额外的逻辑控制

python装饰器,允许动态地修改函数或类的行为;装饰器是一种函数,它接受一个函数作为参数,并返回一个新的函数或修改原来的函数     原函数->装饰器函数->新函数
装饰器的语法使用@decorator_name来应用在函数或方法上
Python还提供一些内置的装饰器,比如@staticmethod和@classmethod,用于定义静态方法和类方法
*是解包操作符,它可以将一个可迭代对象(如列表、元组)解包成单独的参数
psutil.cpu_count: 用于获取系统的CPU核心数
ast.literal_eval: 用于将字符串形式的Python字面量转换成对应的Python对象
eval: 可以执行任意Python代码
json.dumps: 用于将Python对象转换为JSON格式字符串的函数,序列化数据,便于数据传输和存储
warnings.filterwarnings: 控制和过滤Python警告信息的显示,常见的action参数(error:将警告转换为异常,ignore:忽略警告,always:总是显示警告,default:使用默认行为,module:为每个模块显示一次,once:只显示一次特定警告)
globals: Python内置函数,它返回当前全局变量的字典
os.path.isfile: 用来判断一个路径是否为文件的函数,返回一个布尔值,如果路径指向一个常规文件,返回True,如果是目录、符号链接或不存在,返回FALSE
urlretrieve: 用于从网络下载文件的函数
列表推导式: [表达式 for 变量 in 可迭代对象 if 条件]
pickle.dump: 将对象转换为字节流并写入文件
signal.signal(signal.SIGTERM, signal_handler) 用于处理系统信号的函数,允许设置特定信号的处理程序
常用的信号类型:SIGINT(中断信号)、SIGTERM(终止信号)、SIGALRM(定时器信号)、SIGCHLD(子进程状态改变)、SIGUSR1/SIGUSR2(用户自定义信号)
dir(): 用于返回对象的所有属性和方法的列表
setattr和getattr: 用于动态地设置和获取对象的属性
from onnxconverter_common.container import CommonSklearnModelContainer 专门用于处理scikit-learn模型到ONNX的转换过程,容器可以存储模型的元数据、管理变量名和作用域,跟踪模型的计算图,处理中间表示
from onnxconverter_common.topology import Topology as ONNXTopology ONNX转换器中的一个核心类,用于管理和构建ONNX模型的计算图拓扑结构,管理计算图结构、节点管理、拓扑信息处理
from onnxconverter_common.registration.get_converter 用于获取特定模型或操作符的ONNX转换器,查找合适的转换器,返回注册过的转换器实例,处理转换器的依赖关系
from ortools.sat.python import cp_model 提供创建和求解约束规划问题的功能
这个模块的主要用途包括:
1.建立约束编程模型(使用CpModel类)
2.定义决策变量(使用NewIntVar,NewBoolVar等方法)
3.添加各种约束条件(例如Add,AddAllDifferent等)
4.设置优化目标(使用Maximize或Minimize方法)
5.求解模型(使用CpSolover类)
thread_registry={}
thread_registry.item(): 返回字典的键值对迭代器,每一项是(key, value)形式的元组
copy.deepcopy()是python中用于创建对象深拷贝的方法,位于copy模块,深拷贝会递归地复制对象中的所有嵌套对象,创建一个完全独立的副本
copy.copy()只进行浅拷贝,只复制对象的第一层 copy.deepcopy()会递归复制所有嵌套对象
sort()是列表对象的一个方法,会直接修改列表,不返回新列表
sorted()它不修改原序列,而是返回一个新的排序列表
参数key:接受一个函数,用于从每个元素中提取比较键,reverse:布尔值,如果设为True则按降序排列,默认为FALSE(升序)
[-k:]表示从排序后的列表中获取最后k个元素,其中:表示一个范围,-k:表示从倒数第k个元素到列表末尾的所有元素
set()函数用于创建一个集合数据类型,集合是一个无序、不重复元素的集合,唯一性、无序性、可变性、只能包含可哈希的对象,集合的元素必须是不可变类型(如整数、字符串、元组),不能包含可变对象(如列表、字典)
np.random.choice(a, size=None, replace=True, p=None):用于从给定的一维数组中随机抽取元素,a可以是一个一维数组或整数,size指定输出数组的形状,默认为None,表示返回单个值,replace布尔值,表示抽样是否有放回,p可选的概率数组,用于指定每个元素被抽取的概率,必须与a长度相同
ast.literal_eval():安全地解析和求值Python字面量;eval()可以任意执行Python表达式,包括可能具有危险性的代码,ast.literal_eval()只解析Python字面量,拒绝任何函数代码执行的表达式
os.path.expanduser(): 展开路径中的波浪符号为用户的家目录
os.path.realpath(): 解析所有符号链接,获取规范路径
os.path.dirname(): 从路径中提取目录名称
os.environ.get("xxx", None): 尝试获取名为"xxx"的环境变量,第二个参数值None是默认值,表示如果环境变量不存在,则返回None,比直接访问os.envrion["TVM_LIBRARY_PATH"]更安全,避免了环境变量不存在时抛出异常
os.path.abspath(): 将相对路径转换为绝对路径
logging.getLogger: 创建一个日志记录器实例
logging.Formatter: 创建一个日志格式化器,定义日志的输出格式
logging.FileHandler: 创建一个文件处理器,用于将日志写入文件
Python的模块导入机制会确保同一个模块只被加载一次,Python的导入系统具有缓存机制,import语句执行后,导入的模块会被存储在sys.modules字典中。当代码再次尝试导入相同的模块时,Python会直接从sys.modules中获取已加载的模块,而不会重新执行模块的代码
sys.modules的主要功能和用途:
模块缓存: 防止模块被重复导入,提高程序效率
模块引用追踪: 记录所有已导入的模块,保持模块的单例性
允许动态操作模块: 可以手动添加、删除或修改已导入的模块
C++静态库与动态库
linux静态库命名规则: "lib[your_library_name].a" lib是前缀,中间是静态库名,扩展名为.a
Linux下使用静态库,只需要在编译的时候,指定静态库的搜索路径(-L选项)、指定静态库名(不需要lib前缀和.a后缀,-l选项)
linux动态库命名规则: libxxx.so,前缀是lib,后缀是.so
linux创建动态库,-fPIC创建与地址无关的编译程序,是为了能够在多个应用程序间共享 -shared指定生成动态链接

Python下划线命名模式 |模式|举例|含义| |:—:|:—:|:—:| |单前导下划线|var|命名约定,仅供内部使用,通常不会由Python解释器强制执行,只作为对程序员的提示| |单末尾下划线|var| 按约定使用以避免与Python关键字的命名冲突| |双前导下划线|var|当在类上下文中使用时,触发”名称修饰”,由Python解释器强制执行| |双前导和双末尾下划线| __var |表示Python语言定义的特殊方法,避免在你自己的属性中使用这种命名方法| |单下划线|_|有时用作临时或无意义变量的名称,也表示Python REPL中最近一个表达式的结果|

静态局部变量
1. 该变量在全局数据区分配内存
2. 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化
3. 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0
4. 它始终驻留在全局数据区,直到程序运行结束,但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束

Static用法
static关键字最基本的用法是:
1.被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来
2.被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来
静态成员可以通过双冒号来使用即<类名>::<静态成员名>
1. 不能通过类名来调用类的非静态成员函数
2. 类的对象可以使用静态成员函数和非静态成员函数
3. 静态成员函数中不能引用非静态成员
4. 类的非静态成员函数可以调用静态成员函数,但反之不能
5. 类的静态成员变量必须先初始化在使用
CMake 基础
文件结构和基本语法
cmake_minimum_required(VERSION <version>)   指定CMake的最低版本要求
project(<project name> [<language>...])      定义项目的名称和使用的编程语言
add_executable(<target><source_files>...)   指定要生成的可执行文件和其源文件
add_library(<target><source_files>...)      创建一个库(静态库或动态库)及其源文件
target_link_libraries(<target><libraries>...) 链接目标文件与其他库
include_directories(<dirs>...)      添加头文件搜索路径
set(<variable><value>...)       设置变量的值
target_include_directories(TARGET target_name [BEFORE | AFTER] [SYSTEM] [PUBLIC | PRIVATE | INTERFACE] [items]...)  设置目标属性
install(TARGETS target1 [target2 ...] 
        [RUNTIME DESTINATION dir]
        [LIBRARY DESTINATION dir]
        [ARCHIVE DESTINATION [dir ...]]
        [PRIVATE_HEADER DESTINATION dir]
        [PUBLIC_HEADER DESTINATION dir])        安装规则
if(expression)
    # Commands
elseif (expression)
    # Commands
else()
    # Commands
endif()        条件语句
add_custom_command(
    TARGET target
    PRE_BUILD | PRE_LINK | POST_BUILD
    COMMAND command1 [ARGS] [WORKING_DIRECTORY dir]
    [COMMAND command2 [ARGS]]
    [DEPENDS [depend1 [depend2 ...]]]
    [COMMENT comment]
    [VERBATIM]
)
CMake 高级特性
1. 自定义CMake模块和脚本
2. 构建配置和目标
3. 高级查找和配置
4. 生成自定义构建步骤
5. 跨平台和交叉编译
6. 目标属性和配置
extern "C"是用来控制C++名称修饰的特殊指令,防止名称修饰,C++编译器会对函数名进行修饰(添加额外信息),以支持函数重载等特性;兼容C调用约定,告诉编译使用C语言的调用约定,而不是C++的
Python ctypes模块的基本使用
ctypes是python的外部函数库,提供了与C兼容的数据类型,并允许调用DLL或共享库中的函数,可以该模块以纯Python形式对这些库进行封装
对一个ctypes类型乘以一个正数可以创建一个数组类型
ctypes预定义的指针类型只提供一个,可以使用ctypes.POINTER来定义新的指针类型,ctypes.pointer()函数构造一个指针对象,ctypes.byref()函数相当于对对象取地址,无参调用指针类型可以创建一个NULL指针,NULL指针的布尔值是FALSE
结构体和联合必须继承自ctypes模块中的Structure和Union,子类必须定义__fields__属性,__fields__是一个二元组列表,二元组中包含field name和field type. type字段必须是一个ctypes类型,比如c_int,或者其他ctypes类型: 结构体、联合、数组、指针
默认情况下,结构体和联合的字段与C的字节对齐是一样的,也可以在定义子类的时候指定类的__pack__属性指定字节对齐大小
ctypes.CFUNCTYPE: 用于在Python中定义C函数指针类型,以便将Python函数包装成C兼容的回调函数
1.回调函数传递: 当调用C函数需要传入函数指针时,CFUNCTYPE允许将Python函数转换为C可识别的函数指针
2.类型安全: 确保python回调函数的采纳数和返回类型与C函数指针的声明严格匹配,避免类型错误导致崩溃
ctypes.c_char_p: 将python字符串转换为C语言中的字符指针类型

数据类型:ctypes提供了一些基本数据类型用来映射C语言和Python的类型 |ctypes类型|C类型|Python类型 |:—:|:—:|:—:| |c_bool|_Bool|bool(1)| |c_char|char|单字符字节串对象| |c_int|int|int| |c_double|double|float| |c_char_p|char *(NUL terminated)|字节串对象或None| |c_void_p|void *|int或None|

ctypes学习链接

startswith是字符串对象的一个方法,用于检查字符串是否以指定的前缀开头,如果字符串以改前缀开头,返回True,否则返回FALSE
`__name__`是Python中的一个内置变量,每个模块都有这个属性,当模块被直接运行时,`__name__`的值是`__main__`;如果模块是被导入的,`__name__`则是模块的名字,比如当用户在一个名为`example.py`的文件中写这段代码时,`__name__`在改文件被导入时会是`example`,而直接运行时是`__main__`
concurrent.futures是Python标准库中的一个模块,用于简化并发编程,通过线程池或进程池实现异步任务管理
抽象线程/进程管理: 提供ThreadPoolExecutor(线程池)和ProcessPoolExecutor(进程池),自动管理资源分配,无需手动创建线程或进程
异步任务提交与结果获取: 通过submit()提交任务,返回Future对象,代表异步操作的结果,使用Future.result()阻塞获取结果
便捷的并发控制: 内置as_completed()迭代已完成的任务,wait()等待指定任务,支持设置最大工作线程/进程数(max_workers)
python中,所有以双下划线__包起来的方法,统称为Magic Method(魔术方法),它是一种的特殊方法,普通方法需要调用,而魔术方法不需要调用就可以自动执行
[pytho魔术方法](https://zhuanlan.zhihu.com/p/329962624)