python知识和项目经验
一些功能的实现
从.py文件中获取函数对象和参数 的字典
在给定的Python脚本中,通过模块导入和反射机制,如何动态获取包含模型函数的模块中的函数及其默认参数,并构建一个字典以便后续使用?
解决方案
test.py
# test.py
import numpy as np
def return_inputs(*args):return args
# 前处理 要求输入为 X, y, **params 输出为 X_new, y_new
def mahalanobis(X, y,threshold=95):mahal_X = np.asarray(X)x_mu = mahal_X - np.mean(mahal_X, axis=0)cov = np.cov(mahal_X.T)inv_covmat = np.linalg.inv(cov)left_term = np.dot(x_mu, inv_covmat)mahal = np.dot(left_term, x_mu.T)d = mahal.diagonal()threshold = np.percentile(d, threshold)mahal_x = mahal_X[d < threshold]return mahal_x, y[d < threshold]
main.py
import test as AF # 导入包含模型函数的模块
import inspect
def getModelParamsFromAF():# 获取模块中的所有成员module_members = AF.__dict__.items()# 构建models字典models = {}for name, member in module_members:if callable(member): # 检查成员是否为函数# 使用inspect模块获取函数的参数信息params = inspect.signature(member).parametersdefault_params = {param: params[param].default for param in params if params[param].default != inspect.Parameter.empty}models[name] = (member, default_params)return modelsprint(getModelParamsFromAF())
总结
本问题涉及在Python脚本中通过模块导入和反射机制,动态获取包含模型函数的模块中的函数及其默认参数,并将其构建成一个字典。通过利用inspect模块获取函数参数信息,作者实现了一个函数getModelParamsFromAF(),该函数返回一个包含模型函数及其默认参数的字典。这种动态获取参数的方法可以方便后续使用,提高代码的灵活性和可维护性。最后,通过print语句输出获取到的模型函数及其默认参数,以便进行进一步的分析和使用。
Python 多进程
相关问题 | 地址 |
---|---|
python使用进程池多进程时,如何打印错误信息 | 博客园 |
在python机器学习中,我想要进行自动调参,这需要比较大的运算能力,但是我发现cpu的性能总是不能跑满,原来是我用了多线程,python对于多线程的支持并不是很好可以看廖雪峰
python多线程为什么不能把多核CPU的性能吃满?
因为Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。
GIL是Python解释器设计的历史遗留问题,通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。
所以,在Python中,可以使用多线程,但不要指望能有效利用多核。如果一定要通过多线程利用多核,那只能通过C扩展来实现,不过这样就失去了Python简单易用的特点。
不过,也不用过于担心,Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。
目前python团队已经计划在3.13版本以后删除GIL锁CSDN链接
把多线程改成多线程
一个例子,根据自己核心数创建进程,然后把数据写入json文件中最后合并
from multiprocessing import Pool
import multiprocessing
import os, time, random
import jsondef long_time_task(name):print('Run task %s (%s)...' % (name, os.getpid()))start = time.time()# 需要保存的数据data = {"name": str(name)}# 将数据写入JSON文件with open('data'+str(name)+'.json', 'w') as f:json.dump(data, f, indent=4)end = time.time()print('Task %s runs %0.2f seconds.' % (name, (end - start)))if __name__=='__main__':print('Parent process %s.' % os.getpid())p = Pool()# 获取CPU的核心数cpu_cores = multiprocessing.cpu_count()print(cpu_cores)for i in range(cpu_cores):p.apply_async(long_time_task, args=(i,))print('Waiting for all subprocesses done...')p.close()p.join()files = []file_path = os.path.dirname(__file__)for file in os.listdir(file_path):if file.find('data') != -1:files.append(file)merged_data = []# 遍历每个文件,读取并解析 JSON 数据,然后添加到合并后的数据列表中for file_name in files:with open(file_name, 'r') as file:print(file_name)data = json.load(file)merged_data.append(data)# 将合并后的数据写入新的 JSON 文件with open('merged.json', 'w') as merged_file:json.dump(merged_data, merged_file, indent=4)print('JSON 文件已合并完成。')print('All subprocesses done.')
加进程锁
from multiprocessing import Process, Queue, Pool
import multiprocessing
import os, time, randomdef write1(q, lock):lock.acquire() # 加上锁for value in ['A', 'B', 'C']:print('Put %s to queue...' % value)q.put(value)time.sleep(random.random())lock.release()def write2(q, lock):lock.acquire() # 加上锁for value in ['D', 'E', 'F']:print('Put %s to queue...' % value)q.put(value)time.sleep(random.random())lock.release()if __name__ == '__main__':q = Queue()manager = multiprocessing.Manager()lock = manager.Lock()pw1 = Process(target=write1, args=(q, lock))pw2 = Process(target=write2, args=(q, lock))# 启动子进程pw,写入:pw1.start()pw2.start()# pr.start()pw1.join()pw2.join()# pr.join()print('所有数据都写入并且读完')
总结
`
写过另外一个程序
collection_lock = Lock()
def collect_with_retry():if collection_lock.acquire(blocking=False):try:main()# breakexcept Exception as e:self.logger.error(f"Collection failed: {str(e)}")finally:collection_lock.release()else:self.logger.warning("Failed to acquire lock for collection after multiple attempts")
if not hasattr(self, 'collection_thread') or not self.collection_thread.is_alive():self.collection_thread = Thread(target=collect_with_retry)self.collection_thread.daemon = Trueself.collection_thread.start()
else:self.logger.warning("Collection is already in progress")
文件所在文件夹外的另一文件导入函数或类
要在一个Python文件中从位于该文件所在文件夹外的另一个文件导入函数或类,你需要确保两个文件都在Python的搜索路径中。假设你有如下的目录结构:
project/
│
├── utils.py
│
└── subfolder/└── myfile.py
在这种情况下,utils.py
文件位于 subfolder
文件夹的外面。要从 myfile.py
中导入 utils.py
中的内容,你可以使用几种方法:
方法1:
修改系统路径
在 myfile.py
中,你可以添加代码来修改系统路径,这样 Python 就可以找到 utils.py
文件。示例如下:
import sys
sys.path.insert(0, '../')from utils import *
这里 sys.path.insert(0, '../')
将 utils.py
文件所在的上级目录添加到 Python 搜索路径的开始处,确保 Python 可以找到并导入 utils.py
。
方法2:
使用相对导入
如果你的项目结构适合使用包的结构(即目录中有 __init__.py
文件),你可以使用相对导入。首先,确保每个需要作为包处理的目录中都有一个空的 __init__.py
文件:
project/
│
├── utils.py
│
└── subfolder/├── __init__.py└── myfile.py
然后,在 myfile.py
中使用相对导入:
from ..utils import *
注意,使用相对导入时,你的脚本必须作为包的一部分运行,不能直接作为主脚本运行,否则会出错。
即,你需要这样的方式执行代码:
python -m myproject.submodule1.myscript
方法3:
使用环境变量
你可以设置 PYTHONPATH
环境变量,使其包括 utils.py
所在的目录。这样,当你运行 Python 时,它会自动将该目录添加到搜索路径中。
在 Unix-like 系统中,你可以在终端中这样设置:
export PYTHONPATH="/path/to/project:$PYTHONPATH"
在 Windows 系统中,你可以在命令提示符中这样设置:
set PYTHONPATH=C:\path\to\project;%PYTHONPATH%
这样设置之后,你可以在 myfile.py
中正常导入:
from utils import *
选择最适合你项目结构和需求的方法来导入模块。如果你正在开发一个较大的项目,考虑使用环境变量或确保你的项目可以作为包运行,这通常更为稳定和灵活。
OS库常用函数
-
获取当前工作目录:
import os current_directory = os.getcwd() print(current_directory)
-
改变工作目录:
os.chdir('/path/to/directory')
-
列出目录中的文件:
files = os.listdir('/path/to/directory') print(files)
-
创建新目录:
os.mkdir('new_directory')
-
删除目录:
os.rmdir('new_directory')
-
检查文件或目录是否存在:
exists = os.path.exists('/path/to/file_or_directory') print(exists)
-
获取文件大小:
file_size = os.path.getsize('/path/to/file') print(file_size)
装饰器函数 @…
在sklearn中看到红框中的函数,于是好奇是什么东西,查到python-函数前一行加@xxxx的含义
于是找到函数定义:
def validate_params(parameter_constraints, *, prefer_skip_nested_validation):
但是,里面没有定义
func参数
于是再看到下面,原来这个函数下面又定义了一个def decorator(func):
这样是可以的嘛?
于是去尝试
def test_func():print(1111)def inner_func(func):func()return @test_func()
def some_func():print("pp")return
some_func()
这也不行啊
进一步了解到,原来:它是通过
functools
重写了装饰器函数,
你要这样写才行
import functools
def test_func():print(1111)### 装饰器函数def decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):return func(*args, **kwargs)return wrapperreturn decorator@test_func()
def some_func():print("pp")returnsome_func()
下面是具体介绍
@validate_params
装饰器的运作原理
装饰器定义:
validate_params
是一个装饰器函数。它的作用是用于验证被装饰函数的参数类型是否符合预设的约束条件。参数约束:
parameter_constraints
是一个字典,用于定义每个参数的允许类型。例如,可以指定某个参数可以是列表或 NumPy 数组。内部装饰器:
decorator
是validate_params
内部定义的装饰器函数。它接受被装饰的函数func
作为参数。参数绑定:
- 在
wrapper
函数中,使用signature(func).bind(*args, **kwargs).arguments
将传入的参数与函数的签名进行绑定,生成一个包含所有参数及其值的字典params
。参数验证:
- 对字典中的每个参数进行检查。使用
any()
函数来判断该参数的值是否符合定义的约束条件。如果不符合,则抛出一个自定义的异常InvalidParameterError
,并提供错误信息。调用原函数:
- 如果所有参数都通过了验证,
wrapper
函数就会调用原始的被装饰函数func
,并返回其结果。
@validate_params
装饰器的核心功能是自动检查函数参数的类型。这可以帮助开发者在调用函数之前发现潜在的错误,增强代码的健壮性和可维护性。通过这种方式,确保了函数在执行时获得正确类型的输入,从而减少了运行时错误的风险。
我写了一个示例代码:
import functools
import numpy as np
from inspect import signatureclass InvalidParameterError(ValueError):passdef validate_params(parameter_constraints, *, prefer_skip_nested_validation):"""装饰器用于验证函数和方法的参数类型和值。"""def decorator(func):setattr(func, "_parameter_constraints", parameter_constraints)@functools.wraps(func)def wrapper(*args, **kwargs):params = signature(func).bind(*args, **kwargs).argumentsto_ignore = ["self", "cls"]params = {k: v for k, v in params.items() if k not in to_ignore}validate_parameter_constraints(parameter_constraints, params, caller_name=func.__qualname__)return func(*args, **kwargs)return wrapperreturn decoratordef validate_parameter_constraints(parameter_constraints, params, caller_name):for param, constraints in parameter_constraints.items():if param not in params:continuevalue = params[param]valid = Falsefor constraint in constraints:# 检查是否为类型if isinstance(constraint, type):if isinstance(value, constraint):valid = Truebreak# 检查是否为 Noneelif constraint is None and value is None:valid = Truebreakif not valid:expected_types = ', '.join(c.__name__ if isinstance(c, type) else str(c) for c in constraints)raise InvalidParameterError(f"{caller_name}: '{param}' must be one of types: {expected_types}.")@validate_params({"y_true": [list, np.ndarray],"y_pred": [list, np.ndarray],"sample_weight": [list, np.ndarray, None],},prefer_skip_nested_validation=True,
)
def mean_squared_error(y_true, y_pred, *, sample_weight=None):"""计算均方误差 (MSE)。"""if sample_weight is not None:sample_weight = np.array(sample_weight)y_true = np.array(y_true)y_pred = np.array(y_pred)if sample_weight is not None:return np.average((y_pred - y_true) ** 2, weights=sample_weight)else:return np.mean((y_pred - y_true) ** 2)# 示例用法
y_true = [3, -0.5, 2, 7] # 真实值
y_pred = [2.5, 0.0, 2, 8] # 预测值
print(mean_squared_error(y_true, y_pred)) # 输出均方误差
结果
sklearn中源码
def validate_params(parameter_constraints, *, prefer_skip_nested_validation):"""Decorator to validate types and values of functions and methods.Parameters----------parameter_constraints : dictA dictionary `param_name: list of constraints`. See the docstring of`validate_parameter_constraints` for a description of the accepted constraints.Note that the *args and **kwargs parameters are not validated and must not bepresent in the parameter_constraints dictionary.prefer_skip_nested_validation : boolIf True, the validation of parameters of inner estimators or functionscalled by the decorated function will be skipped.This is useful to avoid validating many times the parameters passed by theuser from the public facing API. It's also useful to avoid validatingparameters that we pass internally to inner functions that are guaranteed tobe valid by the test suite.It should be set to True for most functions, except for those that receivenon-validated objects as parameters or that are just wrappers around classesbecause they only perform a partial validation.Returns-------decorated_function : function or methodThe decorated function."""def decorator(func):# The dict of parameter constraints is set as an attribute of the function# to make it possible to dynamically introspect the constraints for# automatic testing.setattr(func, "_skl_parameter_constraints", parameter_constraints)@functools.wraps(func)def wrapper(*args, **kwargs):global_skip_validation = get_config()["skip_parameter_validation"]if global_skip_validation:return func(*args, **kwargs)func_sig = signature(func)# Map *args/**kwargs to the function signatureparams = func_sig.bind(*args, **kwargs)params.apply_defaults()# ignore self/cls and positional/keyword markersto_ignore = [p.namefor p in func_sig.parameters.values()if p.kind in (p.VAR_POSITIONAL, p.VAR_KEYWORD)]to_ignore += ["self", "cls"]params = {k: v for k, v in params.arguments.items() if k not in to_ignore}validate_parameter_constraints(parameter_constraints, params, caller_name=func.__qualname__)try:with config_context(skip_parameter_validation=(prefer_skip_nested_validation or global_skip_validation)):return func(*args, **kwargs)except InvalidParameterError as e:# When the function is just a wrapper around an estimator, we allow# the function to delegate validation to the estimator, but we replace# the name of the estimator by the name of the function in the error# message to avoid confusion.msg = re.sub(r"parameter of \w+ must be",f"parameter of {func.__qualname__} must be",str(e),)raise InvalidParameterError(msg) from ereturn wrapperreturn decorator@validate_params({"y_true": ["array-like"],"y_pred": ["array-like"],"sample_weight": ["array-like", None],"multioutput": [StrOptions({"raw_values", "uniform_average"}), "array-like"],},prefer_skip_nested_validation=True,
)
def mean_absolute_error(y_true, y_pred, *, sample_weight=None, multioutput="uniform_average"
):"""Mean absolute error regression loss.Read more in the :ref:`User Guide <mean_absolute_error>`.Parameters----------y_true : array-like of shape (n_samples,) or (n_samples, n_outputs)Ground truth (correct) target values.y_pred : array-like of shape (n_samples,) or (n_samples, n_outputs)Estimated target values.sample_weight : array-like of shape (n_samples,), default=NoneSample weights.multioutput : {'raw_values', 'uniform_average'} or array-like of shape \(n_outputs,), default='uniform_average'Defines aggregating of multiple output values.Array-like value defines weights used to average errors.'raw_values' :Returns a full set of errors in case of multioutput input.'uniform_average' :Errors of all outputs are averaged with uniform weight.Returns-------loss : float or ndarray of floatsIf multioutput is 'raw_values', then mean absolute error is returnedfor each output separately.If multioutput is 'uniform_average' or an ndarray of weights, then theweighted average of all output errors is returned.MAE output is non-negative floating point. The best value is 0.0.Examples-------->>> from sklearn.metrics import mean_absolute_error>>> y_true = [3, -0.5, 2, 7]>>> y_pred = [2.5, 0.0, 2, 8]>>> mean_absolute_error(y_true, y_pred)0.5>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]>>> y_pred = [[0, 2], [-1, 2], [8, -5]]>>> mean_absolute_error(y_true, y_pred)0.75>>> mean_absolute_error(y_true, y_pred, multioutput='raw_values')array([0.5, 1. ])>>> mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7])0.85..."""y_type, y_true, y_pred, multioutput = _check_reg_targets(y_true, y_pred, multioutput)check_consistent_length(y_true, y_pred, sample_weight)output_errors = np.average(np.abs(y_pred - y_true), weights=sample_weight, axis=0)if isinstance(multioutput, str):if multioutput == "raw_values":return output_errorselif multioutput == "uniform_average":# pass None as weights to np.average: uniform meanmultioutput = Nonereturn np.average(output_errors, weights=multioutput)
函数中的*号和**号
在 Python 中,*
和 **
是用于处理函数参数的特殊符号。它们分别表示不同的含义,主要用于处理可变数量的参数和解包操作。以下是详细的介绍:
1. **单星号
* 的作用**
*
主要用在以下两种场景:
(1) *定义可变位置参数(args)
在函数定义中,*args
用于接收任意数量的位置参数。这些参数会被打包成一个元组(tuple),供函数内部使用。
def my_function(*args):print(args) # args 是一个元组my_function(1, 2, 3)
# 输出: (1, 2, 3)
*args
中的args
只是一个约定俗成的名字,你可以使用其他名字,比如*values
。- 这些参数是按位置传递的,调用时不需要指定参数名。
(2) 解包可迭代对象
在函数调用时,*
可以用来解包一个可迭代对象(如列表、元组等),将其元素作为独立的位置参数传递给函数。
def add(a, b, c):return a + b + cnumbers = [1, 2, 3]
result = add(*numbers) # 等价于 add(1, 2, 3)
print(result)
# 输出: 6
2. **双星号
** 的作用**
**
主要用在以下两种场景:
(1) **定义可变关键字参数(kwargs)
在函数定义中,**kwargs
用于接收任意数量的关键字参数。这些参数会被打包成一个字典(dictionary),供函数内部使用。
def my_function(**kwargs):print(kwargs) # kwargs 是一个字典my_function(a=1, b=2, c=3)
# 输出: {'a': 1, 'b': 2, 'c': 3}
**kwargs
中的kwargs
同样只是一个约定俗成的名字,你可以使用其他名字,比如**options
。- 这些参数是通过键值对传递的,调用时需要指定参数名。
(2) 解包字典
在函数调用时,**
可以用来解包一个字典,将其键值对作为独立的关键字参数传递给函数。
def greet(name, age):print(f"Hello {name}, you are {age} years old.")info = {"name": "Alice", "age": 25}
greet(**info) # 等价于 greet(name="Alice", age=25)
# 输出: Hello Alice, you are 25 years old.
3. **
*和
** 的结合使用**
在一个函数定义中,可以同时使用 *args
和 **kwargs
,分别处理位置参数和关键字参数。
def my_function(*args, **kwargs):print("Positional arguments:", args)print("Keyword arguments:", kwargs)my_function(1, 2, 3, a=4, b=5)
# 输出:
# Positional arguments: (1, 2, 3)
# Keyword arguments: {'a': 4, 'b': 5}
4. **注意事项**
-
顺序规则:在函数定义中,参数的顺序必须是:
- 普通参数
*args
- 带默认值的参数
**kwargs
示例:
def example(a, b, *args, c=10, **kwargs):pass
-
强制关键字参数:从 Python 3 开始,可以通过在
*
后面添加参数来强制要求某些参数必须通过关键字传递。例如:def example(a, *, b):print(a, b)example(1, b=2) # 正确 example(1, 2) # 错误,TypeError
总结
*
用于处理可变数量的位置参数或解包可迭代对象。**
用于处理可变数量的关键字参数或解包字典。- 它们可以单独使用,也可以结合使用,提供了灵活的函数参数处理方式。
如果你有更多具体问题,欢迎继续提问!
遇到的问题
导入路径问题(原本main函数调用它,现在直接运行该文件,导包路径变化)
问题描述
在运行 Python 文件时,可能会遇到以下错误:
ModuleNotFoundError: No module named 'utils'
原因:
- Python 的模块导入机制依赖于当前工作目录和
sys.path
中的路径。 - 当直接运行某个文件时,Python 会将该文件所在目录添加到
sys.path
,而不是项目的根目录,导致无法正确导入其他模块。
解决方法 (一般再临时调试时候会出现,我推荐使用方法三)
方法 1:
修改 sys.path
在代码中手动将项目的根目录添加到 sys.path
:
import sys
import oscurrent_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.abspath(os.path.join(current_dir, '..'))if project_root not in sys.path:sys.path.append(project_root)from utils.subgraph_extraction import *
优点:简单直接,适合快速调试。
缺点:不够优雅,可能不适合复杂项目。
方法 2:
使用相对导入
如果项目是一个包(包含 __init__.py
),可以使用相对导入:
from ..utils.subgraph_extraction import *
然后从项目的根目录运行脚本:
python -m utils.Core_functions
优点:符合 Python 包管理规范,适合大型项目。
缺点:不能直接运行单个文件,需要调整运行方式。
方法 3:
设置环境变量 PYTHONPATH
在运行脚本前,设置环境变量 PYTHONPATH
指向项目的根目录。
比如这样,我原本再根目录调用这个文件,没有问题,但是现在我想要进入这个文件里面运行它
就会报错:
这样再运行就没问题了
- Linux/MacOS:
export PYTHONPATH=/path/to/your/project python utils/Core_functions.py
- Windows(命令提示符):
set PYTHONPATH=C:\path\to\your\project python utils\Core_functions.py
- Windows(PowerShell):
$env:PYTHONPATH = "C:\path\to\your\project" python utils\Core_functions.py
优点:无需修改代码,适合团队协作。
缺点:需要每次运行前设置环境变量。
方法 4
:使用 IDE 配置工作目录
通过 IDE 配置运行时的工作目录为项目的根目录。
-
PyCharm:
- 打开运行配置(Run/Debug Configurations)。
- 设置
Working Directory
为项目的根目录。
-
VSCode:
在.vscode/launch.json
中添加以下配置:{"version": "0.2.0","configurations": [{"name": "Run Core_functions","type": "python","request": "launch","program": "utils/Core_functions.py","cwd": "${workspaceFolder}"}] }
优点:适合开发环境,无需修改代码。
缺点:仅适用于特定 IDE。
方法 5
:重构项目结构
将所有模块组织为一个包,并通过入口脚本(如 main.py
)统一调用。例如:
project/
├── main.py
├── utils/
│ ├── __init__.py
│ ├── Core_functions.py
│ └── subgraph_extraction.py
在 main.py
中:
from utils.Core_functions import some_functionif __name__ == "__main__":some_function()
然后始终通过 main.py
运行项目:
python main.py
优点:规范项目结构,避免路径问题。
缺点:需要对项目进行一定的重构。
总结
- 临时调试:推荐 方法 1 或 方法 3。
- 长期维护:推荐 方法 2 或 方法 5。
- IDE 开发:推荐 方法 4。
根据具体需求选择合适的方法即可!
相关文章:
python知识和项目经验
一些功能的实现 从.py文件中获取函数对象和参数 的字典 在给定的Python脚本中,通过模块导入和反射机制,如何动态获取包含模型函数的模块中的函数及其默认参数,并构建一个字典以便后续使用? 解决方案 test.py # test.py impor…...
【自学笔记】版本控制与持续集成基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 版本控制与持续集成基础知识点总览版本控制(Version Control)1. 版本控制简介2. 常用版本控制系统3. Git基础4. Git进阶 持续集成࿰…...
云平台结合DeepSeek的AI模型优化实践:技术突破与应用革新
目录 前言 一、技术架构:算力与算法的协同基石 1. 蓝耘平台的核心优势 2. DeepSeek的模型创新 二、应用场景:垂直领域的智能化落地 1. 商业领域:智能推荐与客服 2. 工业领域:质检与流程优化 3. 智慧城市与医…...
DockerFile优化镜像体积
title: DockerFile优化镜像体积 date: 2025-02-15 15:22:40 tags: DockerFile优化镜像体积DockerFile优化镜像体积 DockerFile优化镜像体积前文回顾:一、细数优化镜像体积的思路与方式二、优化Dockfile文件编辑 Dockerfile2文件三、构建镜像四、运行镜像五、查看运行效果原文 …...
WeMos D1+PIR+Android 的小场景制作
最近在做一个有趣的小场景功能,其实已经有成熟产品,但是考虑到没法实现场景扩展,所以自己开始动手做。 场景描述:玄关人体感应,有人进门,致欢迎词,有人离开,致欢送词。 硬件设备&a…...
实现pytorch注意力机制-one demo
主要组成部分: 1. 定义注意力层: 定义一个Attention_Layer类,接受两个参数:hidden_dim(隐藏层维度)和is_bi_rnn(是否是双向RNN)。 2. 定义前向传播: 定义了注意力层的…...
使用循环队列来接收串口信息--以stm32f103为例
一、引言 在stm32中,一般采用的是通过数组来接收串口信息,但是由于受到数组大小的限制,易出现数据覆盖或者数据溢出问题。针对上述问题,采用循环队列的方式来接收串口信息,循环队列可以动态管理缓冲区并且当队列满时&a…...
代码随想录D50-51 图论 Python
理论基础 理论基础部分依然沿用代码随想录教程中的介绍: 图的种类 度 连通性 连通性用于表示图中节点的连通情况。 如果有节点不能到达其他节点,则为非连通图,想象将多个水分子表示为图,不考虑非键作用,这张图就不是…...
大幂计算和大阶乘计算【C语言】
大幂计算: #include<stdio.h> long long int c[1000000]{0}; int main() {long long a,b,x1;c[0]1;printf("请输入底数:");scanf("%lld",&a);printf("请输入指数:");scanf("%lld",&b…...
段错误 (核心已转储)
struct Addressbooks {struct Person personArray[MAX];int m_Size; // 当前已用大小 };void addPerson(Addressbooks *abs) {// 开始添加操作string name;cout << "输入姓名:";cin >> name;// 下面这句话执行后就报:段错误 (核心…...
Leetcode 227-基本计算器 II
题解 本题不包含括号,比较简单 双栈法(运算符栈数字栈) 对于「任何表达式」而言,可以都使用两个栈 nums 和 ops(本题只用到了nums): nums : 存放所有的数字 ops :存放…...
springcloudalibaba组件gateway
Spring Cloud Alibaba 组件中的 Gateway 是一个基于 Spring Cloud Gateway 实现的 API 网关,它专为微服务架构提供简单且有效的 API 路由管理方式。以下是对 Spring Cloud Alibaba Gateway 的详细介绍: 一、基本概念 API 网关:作为系统的统…...
MongoDB副本集
副本集架构 对于mongodb来说,数据库高可用是通过副本集架构实现的,一个副本集由一个主节点和若干个从节点所组成。 客户端通过数据库主节点写入数据后,由从节点进行复制同步,这样所有从节点都会拥有这些业务数据的副本࿰…...
LeetCode-680. 验证回文串 II
1、题目描述: 给你一个字符串 s,最多 可以从中删除一个字符。 请你判断 s 是否能成为回文字符串:如果能,返回 true ;否则,返回 false 。 示例 1: 输入:s "aba" 输出&a…...
国产编辑器EverEdit - “切换文件类型”的使用场景
1 “切换文件类型”的使用场景 1.1 应用背景 一般的编辑器都是通过扩展名映射到对应的语法高亮规则的,比如:文件test.xml中的扩展名“xml"对应XML的语法高亮,在编辑器中打开test.xml就会给不同标识符显示不同的颜色。 但有时一些应用程…...
AIP-146 泛化域
编号146原文链接AIP-146: Generic fields状态批准创建日期2019-05-28更新日期2019-05-28 API中的大多数域,无论是在请求、资源还是自定义应答中,都有具体的类型或模式。这个模式是约定的一部分,开发者依此约定进行编码。 然而,偶…...
C++11 thread
文章目录 C11 线程库线程对象的构造方式无参的构造函数调用带参的构造函数调用移动构造函数thread常用成员函数 this_thread命名空间join && detachmutex C11 线程库 线程对象的构造方式 无参的构造函数 1、调用无参的构造函数,调用无参的构造函数创建出来的线程对象…...
重生之我在异世界学编程之C语言:深入预处理篇(上)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、预处理的作用与流程…...
Java并发编程5--Java内存模型的基础
1.并发编程模型的两个关键问题 在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。 通信是指线程之间以何种机制来交换信息。 在命令式编程中,线程之间的通…...
国密算法SM1、SM2、SM3和SM4 具体的使用和区别
国密算法是中国自主研发的密码算法,包括SM1、SM2、SM3和SM4,分别用于不同场景。以下是它们的具体使用和区别: SM1 对称加密算法 类型: 对称加密 密钥长度: 128位 使用场景: 用于数据加密和解密,适用于金融、政务等领域。 特点: …...
package.json的全面详解
在 Node.js 的世界里,package.json 文件占据着举足轻重的地位。它就像项目的“大脑”,掌控着项目的各种信息和依赖管理。下面,我们就深入剖析 package.json 文件,让你全面了解它的奥秘。 一、创建 package.json 在正式开始使用 …...
Linux、Docker与Redis核心知识点与常用命令速查手册
Linux、Docker与Redis核心知识点与常用命令速查手册 一、Linux基础核心 1. 核心概念 文件系统:采用树形结构,根目录为/权限机制:rwx(读/写/执行)权限,用户分为owner/group/others软件包管理: …...
通过TDE工业通讯网关解决设备通讯问题
设备通讯现状 在现代工业环境中,设备的通讯已成为提高生产效率和实现智能化管理的关键。随着工业4.0时代的到来,越来越多的智能设备被投入到生产运营中,这些设备通过集成特定的通信模块,形成了各自独立的自组网子系统。然而&…...
CI/CD(二)docker-compose安装Jenkins
1、docker-compose.yml version: 3.8services:jenkins:image: jenkins/jenkins:lts # 使用官方的 Jenkins LTS 镜像container_name: jenkinsuser: root # 如果需要以 root 用户运行ports:- "8080:8080" # Jenkins Web 界面端口- "50000:50000" # 用于 Jen…...
Linux操作系统3-文件与IO操作5(动态库与静态库的建立与加载)
上篇文章:Linux操作系统3-文件与IO操作4(软硬链接的建立与使用, 文件的三种时间)-CSDN博客 本篇代码Gitee仓库:myLerningCode/l21 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 本篇重点:动态库与静态库 目录 一. 静…...
同步异步日志系统-日志器的实现
该模块是针对于前几个模块的整合,也是直接面向客户所使用的,对于该模块的实现,我们基于:继承建造者设计模式来实现; 因此我们需要抽象出一个日志器抽象基类; 该基类提供的接口如下: 1、 debug();//站在用户的角度来说就是我只需要…...
webpack 项目优化(一)
一、构建速度优化 缩小文件处理范围 module: {rules: [{test: /\.js$/,exclude: /node_modules/, // 排除第三方库include: path.resolve(__dirname, src), // 限定处理范围use: babel-loader}] }利用缓存 Webpack 5 内置持久化缓存(直接配置)࿱…...
【撰写技巧】基金项目撰写跟踪交流会
基金申请书撰写完成后,提交前的审查是一个非常关键的步骤,这决定了你提交的材料是否符合要求,是否具备足够的说服力,以及是否能够通过专家评审。审查主要可以分为自我审查和团队审查两个层面。以下是基金申请书审查的主要内容和注…...
vue学习笔记
结合目录,点击阅读 文章目录 案例1:第一行vue代码App.vue引入Person.vue案例:改变变量的值案例:改变对象属性值案例:toRefs进行解包案例:给名字首字母大写案例:监视变量值的变化案例࿱…...
前端构建工具——Webpack和Vite的主要区别
目录 1. 设计理念2. 性能表现3. 使用场景4. 配置复杂度5. 生态系统6. 性能对比总结7. 选择建议 1. 设计理念 Webpack 设计理念:Webpack是一个通用的模块打包工具,它将项目中的各种资源(如JavaScript、CSS、图片等)视为模块&…...
Letsencrypt+certbot为域名免费配置ssl
1、基础概念 Let’s Encrypt 是一个提供免费 SSL/TLS 证书的认证机构,它的目标是让互联网上的通信更加安全,特别是普及 HTTPS。通过 Let’s Encrypt 提供的证书,网站可以使用加密连接,保护用户的数据传输。 Certbot 是一个由电子…...
达梦数据库针对慢SQL,收集统计信息清除执行计划缓存
前言:若遇到以下场景,大概率是SQL走错了执行计划: 1、一条SQL在页面上查询特别慢,但拿到数据库终端执行特别快 2、一条SQL在某种检索条件下查询特别慢,但拿到数据库终端执行特别快 此时,可以尝试按照下述步…...
IDEA通过Contince接入Deepseek
Deepseek 的出色表现,上期【Deepseek得两种访问方式与本地部署】 安装Continue插件 第一步、下载插件 在编辑栏【File】->设置【Settiings】或快捷键【CtrlAltS】,弹窗的左侧导航树,选择【plugins】,在marketplace 搜索【Continue】,点…...
Windows 10 ARM工控主板CAN总线实时性能测试
在常规的Windows系统中支持CAN总线应用,需要外接CAN总线适配器,通常为USB转CAN模块或PCI接口CAN卡。实时性本身是CAN总线的显著特性之一,但由于Windows并非实时操作系统,应用程序容易受到系统CPU负载影响,导致调度周期…...
深入理解无锁队列与C++原子操作
文章目录 深入理解无锁队列与C原子操作引言原子操作基础什么是原子操作?内存顺序(Memory Order) 无锁队列实现环形缓冲区队列(单生产者/单消费者)链表式无锁队列(多生产者/多消费者) 关键问题与…...
OpenGL: QOpenGLShaderProgram
一、QOpenGLShaderProgram 编译过程的封装 1、bool addShaderFromSourceCode(QGLShader::ShaderType type, const char * source); 2、bool addShaderFromSourceFile(QGLShader::ShaderType type, const QString & fileName); 3、virtual bool link(); 4、bool bind(); 5、…...
【网络编程】之数据链路层
【网络编程】之数据链路层 数据链路层基本介绍基本功能常见协议 以太网什么是以太网以太网协议帧格式数据链路层的以太网帧报文如何封装/解封装以及分用以太网通信原理传统的以太网与集线器现代以太网与交换机碰撞域的概念 Mac地址基本概念为什么要使用Mac地址而不是使用IP地址…...
HTTP 和 TCP/IP-傻傻分不清
HTTP 和 TCP/IP 是计算机网络中不同层次的协议,它们的核心区别在于功能和所属的网络层次。以下是详细对比: 1. 所属网络层次 TCP/IP 定位:TCP/IP 是一个协议族(包含多个协议),涵盖网络通信的传输层和网络层…...
【SQL】SQL约束
🎄约束 📢作用:是用于限制存储再表中的数据。可以再创建表/修改表时添加约束。 📢目的:保证数据库中数据的正确、有效性和完整性。 📢对于一个字段可以同时添加多个约束。 🎄常用约束: 约束分类 约束 描述关键字非…...
【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑧】
ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase08 作者:车端域控测试工程师 更新日期:2025年02月17日 关键词:UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-008测试用例 用例ID测试场景验证要点参考条款预期结果TC…...
解决vue-awesome-swiper 4.x + swiper 5.x 分页pagination配置不生效问题
这次给的需求需要实现几个轮播图,我打算用swiper来做。刚开始我参照同事之前实现的swiper,复制到我的新页面中,是可用的。但是这次的需求需要有底下的分页pagination,而且因为版本比较老,比较难找到配置项。这里说一下…...
Spring Boot 开发入门
文章来源:开发您的第一个 Spring Boot 应用程序 (Developing Your First Spring Boot Application) _ Spring Boot3.4.0中文文档(官方文档中文翻译)|Spring 教程 —— CADN开发者文档中心 本节介绍如何开发一个小型的 “Hello World!” Web 应用程序&…...
MATLAB算法实战应用案例精讲-【数模应用】空间插值(附MATLAB、R语言和python代码实现)
目录 前言 算法原理 什么是插值? 为什么要插值? 常见插值方法 插值方法选择 GIS中常用的空间分析方法 一、空间插值 二、缓冲区分析 三、空间统计 四、领域分析 五、网络分析 六、多标准决策 插值分析 插值应用示例 空间插值的类型 不同工具箱中的空间插值工…...
碰一碰发视频@技术原理与实现开发步骤
碰一碰发视频系统:技术原理与实现方案解析 引言 近年来,随着移动支付和近场通信技术(NFC)的普及,“碰一碰”功能逐渐成为商家与用户交互的新入口。通过“碰一碰加盟”模式,企业可以快速赋能线下商户&…...
14.学成在线开发小结
1.统计两张表的数据,表1和表2是一对多的关系,如果既要统计表1又要统计表2的数据,要分开进行统计,否则表1一条数据在表2中可能有多条数据对应,导致表1的数据被多次统计。 2.nacos配置文件的数据读取不到可能原因有&…...
图像处理之CSC
CSC 是 Color Space Conversion(色彩空间转换)的缩写,它涉及图像处理中的亮度、饱和度、对比度和色度等参数的调整。这些参数是图像处理中的核心概念,通常用于描述和操作图像的颜色信息。 以下是亮度、饱和度、对比度和色度与 CS…...
数据结构:顺序表(Sequence List)及其实现
什么是顺序表? 顺序表是一种最简单的数据结构,它就像一排连续的小房子,每个房子里都住着一个数据元素。这些房子是按顺序排列的,每个房子都有一个门牌号(下标),我们可以通过门牌号快速找到对应…...
微信云开发小程序音频播放踩坑记录 - 从熄屏播放到iOS静音
在开发小程序冥想功能时,我们遇到了几个棘手的问题:用户反馈手机熄屏后音频停止、iOS设备播放没声音、冥想音频没有访问计数和CDN缓存优化等。本文将分享这些问题的解决过程和实践经验。 微信小程序简称:Moodo 微信小程序全程:AIMoodo心情日记系统 简…...
Python基础
https://www.w3schools.com/https://docs.python.org/3/ Python 介绍 Python是跨平台的,它可以运行在Windows、Mac和各种Linux/Unix系统上。在Windows上写Python程序,放到Linux上也是能够运行的。 要开始学习Python编程,首先就得把Python安装…...
基于Go语言 XTA AI聊天界面实现
项目开源地址: XTA-AI-SDK 人工智能技术的迅速发展,AI聊天应用变得越来越流行。本文将介绍如何使用Go语言和LCL库( Lazarus Component Library)创建一个功能丰富的AI聊天界面。项目主要包含以下模块: 项目背景 本项目旨在为开发…...