【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.30 性能巅峰:NumPy代码优化全攻略
1.30 性能巅峰:NumPy代码优化全攻略
目录
1.30.1 向量化操作的黄金法则1.30.1.1 向量化操作的基本概念1.30.1.2 向量化操作的性能优势1.30.1.3 向量化操作的实战案例
1.30.2 循环优化的JIT编译方案1.30.2.1 JIT编译的基本原理1.30.2.2 Numba加速NumPy代码1.30.2.3 Numba加速遗留代码案例
1.30.3 多线程与多进程加速1.30.3.1 Python多线程的基本概念1.30.3.2 多线程GIL规避技巧1.30.3.3 Python多进程的基本概念1.30.3.4 多进程加速NumPy计算
1.30.4 分布式计算的Dask集成1.30.4.1 Dask的基本概念1.30.4.2 Dask与NumPy的集成1.30.4.3 分布式矩阵乘法实现
1.30.5 性能剖析火焰图解读1.30.5.1 性能剖析的基本概念1.30.5.2 使用火焰图进行性能分析1.30.5.3 火焰图的解读技巧
1.30 性能巅峰:NumPy代码优化全攻略
1.30.1 向量化操作的黄金法则
1.30.1.1 向量化操作的基本概念
向量化操作是指在NumPy中利用内置的高效数组操作来替代显式的循环操作。NumPy的数组操作是用C语言实现的,因此在处理大量数据时,向量化操作比Python的显式循环要快得多。
- 什么是向量化操作:向量化操作是NumPy的核心特性之一,它通过使用内部优化的C语言实现,使得数组操作更加高效。
- 向量化操作的优势:向量化操作可以显著提高代码的执行速度,减少内存占用,使代码更加简洁易读。
1.30.1.2 向量化操作的性能优势
通过对比向量化操作和显式循环,我们可以直观地看到向量化操作的性能优势。
import numpy as np
import time# 生成100万个随机数的数组
data = np.random.rand(1000000) # 生成随机数数组# 显式循环计算平方和
start_time = time.time()
sum_of_squares = 0
for x in data:sum_of_squares += x ** 2 # 计算平方和
end_time = time.time()
loop_time = end_time - start_time
print(f"显式循环计算时间: {loop_time}秒") # 打印计算时间# 向量化操作计算平方和
start_time = time.time()
sum_of_squares_vectorized = np.sum(data ** 2) # 向量化计算平方和
end_time = time.time()
vectorized_time = end_time - start_time
print(f"向量化操作计算时间: {vectorized_time}秒") # 打印计算时间# 比较两种方法的性能
print(f"性能提升比例: {loop_time / vectorized_time}")
- 显式循环:使用Python的显式循环逐个元素进行计算。
- 向量化操作:使用NumPy的向量化操作一次性处理整个数组。
- 性能对比:通过计算时间比较两种方法的性能,向量化操作通常比显式循环快多个数量级。
1.30.1.3 向量化操作的实战案例
通过实战案例,我们进一步了解如何在实际项目中应用向量化操作。
import numpy as np# 生成100万个随机数的数组
data = np.random.rand(1000000) # 生成随机数数组# 计算所有元素的平方
squared_data = data ** 2 # 向量化计算平方# 计算所有元素的平方根
sqrt_data = np.sqrt(data) # 向量化计算平方根# 计算所有元素的绝对值
abs_data = np.abs(data) # 向量化计算绝对值# 计算所有元素的对数
log_data = np.log(data) # 向量化计算对数# 打印前10个元素的计算结果
print("平方前10个元素:", squared_data[:10])
print("平方根前10个元素:", sqrt_data[:10])
print("绝对值前10个元素:", abs_data[:10])
print("对数前10个元素:", log_data[:10])
- 生成数据:生成一个100万个随机数的数组。
- 向量化计算:使用NumPy的向量化操作计算平方、平方根、绝对值和对数。
- 结果展示:打印前10个元素的计算结果,验证计算的正确性。
1.30.2 循环优化的JIT编译方案
1.30.2.1 JIT编译的基本原理
JIT(Just-In-Time)编译是一种编译技术,它在程序运行时将部分代码编译为机器码,以提高执行效率。Numba是一个用于Python的JIT编译器,特别适合优化NumPy代码。
- JIT编译的定义:JIT编译是在程序运行时将部分代码编译为机器码的技术。
- Numba的作用:Numba可以将Python函数编译为机器码,显著提高NumPy代码的执行速度。
1.30.2.2 Numba加速NumPy代码
Numba通过简单的装饰器即可实现对NumPy代码的加速。
import numpy as np
from numba import njit
import time# 生成100万个随机数的数组
data = np.random.rand(1000000) # 生成随机数数组# 普通Python函数计算平方和
def sum_of_squares(data):sum_of_squares = 0for x in data:sum_of_squares += x ** 2 # 计算平方和return sum_of_squares# 使用Numba的JIT编译器加速
@njit
def sum_of_squares_numba(data):sum_of_squares = 0for x in data:sum_of_squares += x ** 2 # 计算平方和return sum_of_squares# 测试普通Python函数
start_time = time.time()
result = sum_of_squares(data)
end_time = time.time()
python_time = end_time - start_time
print(f"普通Python函数计算时间: {python_time}秒,结果: {result}")# 测试Numba加速的函数
start_time = time.time()
result_numba = sum_of_squares_numba(data)
end_time = time.time()
numba_time = end_time - start_time
print(f"Numba加速的函数计算时间: {numba_time}秒,结果: {result_numba}")# 比较性能
print(f"性能提升比例: {python_time / numba_time}")
- 普通Python函数:定义一个普通Python函数计算平方和。
- Numba加速:使用Numba的
@njit
装饰器对函数进行JIT编译。 - 性能测试:通过计算时间比较两种方法的性能,Numba加速的函数通常比普通Python函数快多个数量级。
1.30.2.3 Numba加速遗留代码案例
Numba不仅可以用于新代码,还可以用于加速遗留代码。
import numpy as np
from numba import njit
import time# 生成100万个随机数的数组
data = np.random.rand(1000000) # 生成随机数数组# 遗留代码:计算元素大于0.5的个数
def count_above_threshold(data, threshold=0.5):count = 0for x in data:if x > threshold:count += 1return count# 使用Numba的JIT编译器加速
@njit
def count_above_threshold_numba(data, threshold=0.5):count = 0for x in data:if x > threshold:count += 1return count# 测试遗留代码
start_time = time.time()
result = count_above_threshold(data)
end_time = time.time()
python_time = end_time - start_time
print(f"遗留代码计算时间: {python_time}秒,结果: {result}")# 测试Numba加速的遗留代码
start_time = time.time()
result_numba = count_above_threshold_numba(data)
end_time = time.time()
numba_time = end_time - start_time
print(f"Numba加速的遗留代码计算时间: {numba_time}秒,结果: {result_numba}")# 比较性能
print(f"性能提升比例: {python_time / numba_time}")
- 遗留代码:定义一个计算数组中元素大于某个阈值的个数的函数。
- Numba加速:使用Numba的
@njit
装饰器对函数进行JIT编译。 - 性能测试:通过计算时间比较两种方法的性能,Numba加速的遗留代码同样可以显著提高执行速度。
1.30.3 多线程与多进程加速
1.30.3.1 Python多线程的基本概念
Python的多线程可以通过threading
模块实现,但受GIL(全局解释器锁)的限制,多线程在CPU密集型任务中并不总是能显著提高性能。
- 多线程的定义:多线程是指在同一个程序中同时运行多个线程,共享内存资源。
- GIL的作用:GIL是为了防止多线程争抢解释器资源而设计的,但也会限制多线程在CPU密集型任务中的性能。
1.30.3.2 多线程GIL规避技巧
尽管有GIL的限制,我们仍然可以通过一些技巧来规避GIL,提高多线程的性能。
import numpy as np
import threading
import time# 生成100万个随机数的数组
data = np.random.rand(1000000) # 生成随机数数组# 多线程计算平方和
def sum_of_squares_thread(data, start, end, result):for i in range(start, end):result[0] += data[i] ** 2 # 计算平方和# 划分数据
num_threads = 4
thread_data_length = len(data) // num_threads
result = np.zeros(1) # 用于存储结果# 创建线程
threads = []
for i in range(num_threads):start = i * thread_data_lengthend = (i + 1) * thread_data_lengththread = threading.Thread(target=sum_of_squares_thread, args=(data, start, end, result))threads.append(thread)thread.start()# 等待所有线程完成
for thread in threads:thread.join()# 打印结果
print(f"多线程计算结果: {result[0]}")
- 多线程函数:定义一个多线程函数计算部分数据的平方和。
- 数据划分:将数据划分为多个部分,每个部分由一个线程处理。
- 线程创建与启动:创建多个线程并启动。
- 结果合并:等待所有线程完成,合并结果。
1.30.3.3 Python多进程的基本概念
Python的多进程可以通过multiprocessing
模块实现,多进程不受GIL的限制,可以充分利用多个CPU核心。
- 多进程的定义:多进程是指在同一个程序中同时运行多个进程,每个进程有自己的内存空间。
- 多进程的优势:多进程不受GIL的限制,可以充分利用多个CPU核心,提高并行计算能力。
1.30.3.4 多进程加速NumPy计算
通过多进程可以显著提高NumPy代码的执行速度。
import numpy as np
import multiprocessing
import time# 生成100万个随机数的数组
data = np.random.rand(1000000) # 生成随机数数组# 多进程计算平方和
def sum_of_squares_process(data, start, end):result = np.sum(data[start:end] ** 2) # 计算部分数据的平方和return result# 划分数据
num_processes = 4
process_data_length = len(data) // num_processes# 使用进程池
with multiprocessing.Pool(processes=num_processes) as pool:results = pool.starmap(sum_of_squares_process, [(data, i * process_data_length, (i + 1) * process_data_length) for i in range(num_processes)])# 计算总和
total_sum_of_squares = np.sum(results) # 计算全部数据的平方和# 打印结果
print(f"多进程计算结果: {total_sum_of_squares}")
- 多进程函数:定义一个多进程函数计算部分数据的平方和。
- 数据划分:将数据划分为多个部分,每个部分由一个进程处理。
- 进程池:使用
multiprocessing.Pool
创建进程池,分配任务并等待结果。 - 结果合并:计算各部分结果的总和。
1.30.4 分布式计算的Dask集成
Dask分布式矩阵乘法
import dask.array as da
from dask.distributed import Client# 创建Dask集群
client = Client(n_workers=4, threads_per_worker=2)# 生成分布式数组
x = da.random.random((50000, 50000), chunks=(5000, 5000))
y = da.random.random((50000, 50000), chunks=(5000, 5000))# 执行分布式计算
z = da.matmul(x, y)# 触发计算并获取结果
result = z.compute() # 自动分配至集群计算
分块算法原理
1.30.4.1 Dask的基本概念
Dask是一个用于并行计算的Python库,它可以扩展NumPy、Pandas等库,实现对大规模数据的处理。
- Dask的定义:Dask是一个用于并行计算的Python库,可以处理大规模数据。
- Dask的特点:Dask支持并行计算、分布式计算和延迟计算,可以与NumPy、Pandas等库无缝集成。
1.30.4.2 Dask与NumPy的集成
Dask提供了dask.array
模块,可以与NumPy无缝集成,实现对大规模数据的高效处理。
import dask.array as da
import numpy as np
import time# 生成1亿个随机数的Dask数组
data = da.random.random((100000000,), chunks=1000000) # 生成随机数数组,分块处理# 计算平方和
start_time = time.time()
sum_of_squares = data ** 2 # 向量化计算平方
total_sum_of_squares = sum_of_squares.sum().compute() # 计算平方和
end_time = time.time()
dask_time = end_time - start_time
print(f"Dask计算时间: {dask_time}秒,结果: {total_sum_of_squares}")
- 生成Dask数组:使用
dask.array
生成一个大规模的Dask数组,并指定分块大小。 - 向量化计算:使用Dask的向量化操作计算平方和。
- 计算结果:调用
compute()
方法计算结果。 - 性能测试:通过计算时间验证Dask的性能优势。
1.30.4.3 分布式矩阵乘法实现
通过Dask可以实现分布式矩阵乘法,处理大规模矩阵数据。
import dask.array as da
import numpy as np
import time# 生成10000x10000的随机矩阵
matrix1 = da.random.random((10000, 10000), chunks=(1000, 1000))
matrix2 = da.random.random((10000, 10000), chunks=(1000, 1000))# 计算矩阵乘法
start_time = time.time()
result = da.dot(matrix1, matrix2).compute() # 计算矩阵乘法
end_time = time.time()
dask_time = end_time - start_time
print(f"Dask矩阵乘法计算时间: {dask_time}秒")# 生成同规模的NumPy矩阵
np_matrix1 = np.random.rand(10000, 10000)
np_matrix2 = np.random.rand(10000, 10000)# 计算矩阵乘法
start_time = time.time()
np_result = np.dot(np_matrix1, np_matrix2) # 计算矩阵乘法
end_time = time.time()
numpy_time = end_time - start_time
print(f"NumPy矩阵乘法计算时间: {numpy_time}秒")# 比较性能
print(f"性能提升比例: {numpy_time / dask_time}")
- 生成Dask矩阵:使用
dask.array
生成两个大规模的Dask矩阵,并指定分块大小。 - 计算矩阵乘法:使用Dask的
dot
方法计算矩阵乘法。 - 性能测试:生成同规模的NumPy矩阵,计算矩阵乘法并比较性能。
- 结果展示:通过计算时间比较两种方法的性能,Dask通常能显著提高大规模矩阵运算的效率。
1.30.5 性能剖析火焰图解读
1.30.5.1 性能剖析的基本概念
性能剖析(Profiling)是分析程序运行时性能的一种技术,通过性能剖析可以找出程序中的性能瓶颈。常见的性能剖析工具包括cProfile
、line_profiler
和yappi
等。
- 性能剖析的定义:性能剖析是指对程序运行时的行为进行分析,以找出性能瓶颈。
- 性能剖析的目标:通过性能剖析,我们可以优化代码,提高程序的执行效率。
- 常用工具:
cProfile
:Python内置的性能剖析工具,可以生成详细的性能报告。line_profiler
:用于逐行性能剖析的工具,可以精确到每一行代码的执行时间。yappi
:一个高效的性能剖析工具,支持多线程和多进程性能分析。
1.30.5.2 使用火焰图进行性能分析
火焰图是一种可视化工具,通过图形化的方式展示程序的性能剖析结果,帮助我们更直观地理解性能瓶颈。
- 火焰图的定义:火焰图是一种可视化工具,通过堆栈帧的形式展示程序的性能剖析结果。
- 火焰图的优势:火焰图可以清晰地展示函数调用的层次关系,以及每一层函数的执行时间,帮助我们快速定位性能瓶颈。
1.30.5.3 火焰图的解读技巧
解读火焰图需要理解其基本结构和颜色编码。
-
堆栈帧:
- 层次关系:火焰图从上到下展示函数调用的层次关系,每一层表示一个函数调用。
- 宽度:每个堆栈帧的宽度表示该函数的执行时间,宽度越大表示时间越长。
- 高度:堆栈帧的高度表示调用深度,越低的堆栈帧表示调用层次越深。
-
颜色编码:
- 颜色:火焰图的颜色编码可以表示不同的函数类型或执行时间。
- 常见颜色:
- 红色:表示执行时间较长的函数。
- 蓝色:表示执行时间较短的函数。
- 绿色:表示用户定义的函数。
-
查找热点:
- 热点函数:火焰图中最宽的堆栈帧表示热点函数,这些函数是性能优化的重点。
- 深度分析:点击火焰图中的堆栈帧可以查看更详细的函数调用信息。
1.30.5.4 生成火焰图
生成火焰图需要使用性能剖析工具和可视化工具。下面是一个使用cProfile
和flamegraph
生成火焰图的示例。
import cProfile
import pstats
from io import StringIO
import flamegraph# 定义一个示例函数
def example_function():data = np.random.rand(1000000)result = np.sum(data ** 2)return result# 使用cProfile进行性能剖析
pr = cProfile.Profile()
pr.enable()
example_function()
pr.disable()# 生成性能报告
s = StringIO()
ps = pstats.Stats(pr, stream=s).sort_stats('cumulative')
ps.print_stats()# 将性能报告转换为火焰图数据
profile_data = s.getvalue()
flamegraph_data = flamegraph.parse_profile(profile_data)# 生成火焰图
flamegraph.render(flamegraph_data, 'flamegraph.svg')
- 性能剖析:使用
cProfile
对example_function
进行性能剖析。 - 生成报告:将性能剖析结果输出到字符串流。
- 转换数据:使用
flamegraph
库将性能报告转换为火焰图数据。 - 生成火焰图:将火焰图数据渲染为SVG文件。
1.30.5.5 火焰图应用示例
通过一个具体的示例,我们演示如何使用火焰图进行性能优化。
import numpy as np
import cProfile
import pstats
from io import StringIO
import flamegraph# 定义一个带有性能瓶颈的函数
def slow_function():data = np.random.rand(1000000)result = 0for x in data:result += x ** 2return result# 定义一个优化后的函数
def fast_function():data = np.random.rand(1000000)result = np.sum(data ** 2)return result# 使用cProfile进行性能剖析
pr = cProfile.Profile()
pr.enable()
slow_function()
pr.disable()# 生成性能报告
s = StringIO()
ps = pstats.Stats(pr, stream=s).sort_stats('cumulative')
ps.print_stats()# 将性能报告转换为火焰图数据
profile_data = s.getvalue()
flamegraph_data = flamegraph.parse_profile(profile_data)# 生成火焰图
flamegraph.render(flamegraph_data, 'slow_function_flamegraph.svg')# 测试优化后的函数
pr = cProfile.Profile()
pr.enable()
fast_function()
pr.disable()# 生成性能报告
s = StringIO()
ps = pstats.Stats(pr, stream=s).sort_stats('cumulative')
ps.print_stats()# 将性能报告转换为火焰图数据
profile_data = s.getvalue()
flamegraph_data = flamegraph.parse_profile(profile_data)# 生成火焰图
flamegraph.render(flamegraph_data, 'fast_function_flamegraph.svg')
- 性能剖析:分别对带性能瓶颈的
slow_function
和优化后的fast_function
进行性能剖析。 - 生成火焰图:生成两个函数的火焰图,比较性能差异。
1.30.5.6 火焰图的高级解读
火焰图不仅可以用于简单的性能分析,还可以用于更复杂的场景,如分布式系统和多线程程序。
- 分布式系统:在分布式系统中,火焰图可以展示不同节点上的性能瓶颈。
- 多线程程序:在多线程程序中,火焰图可以展示不同线程的执行时间和调用关系。
1.30.6 总结
通过本文的学习,我们掌握了NumPy代码优化的多种方法,包括向量化操作、JIT编译、多线程与多进程加速、Dask分布式计算以及性能剖析和火焰图解读。这些方法不仅能够显著提高代码的执行效率,还能使代码更加简洁易读。希望通过本文的介绍,您能够在实际项目中应用这些技术,提升程序的性能。
参考文献
序号 | 名称 | 链接 |
---|---|---|
1 | NumPy官方文档 | NumPy官网 |
2 | Numba官方文档 | Numba官网 |
3 | Dask官方文档 | Dask官网 |
4 | Python cProfile 库官方文档 | Python cProfile官方文档 |
5 | flamegraph 工具官方文档 | FlameGraph GitHub |
6 | threading 模块官方文档 | Python threading官方文档 |
7 | multiprocessing 模块官方文档 | Python multiprocessing官方文档 |
8 | 全局解释器锁(GIL) | Python GIL Wikipedia |
9 | 并行计算的概念 | Parallel Computing |
10 | 计算机性能优化基礎 | Performance Optimization Basics |
11 | Python性能剖析指南 | Python Profiling Guide |
12 | 火焰图入门 | Introduction to Flame Graphs |
13 | 火焰图高级解读 | Advanced Flame Graphs Interpretation |
14 | NumPy性能优化技巧 | NumPy Performance Optimization |
15 | Dask性能优化文档 | Dask Performance Optimization |
这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。
相关文章:
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.30 性能巅峰:NumPy代码优化全攻略
1.30 性能巅峰:NumPy代码优化全攻略 目录 #mermaid-svg-CMVXy3CN2tNmW8RJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CMVXy3CN2tNmW8RJ .error-icon{fill:#552222;}#mermaid-svg-CMVXy3CN2tNmW8RJ …...
C#方法(练习)
1.定义一个函数,输入三个值,找出三个数中的最小值 2.定义一个函数,输入三个值,找出三个数中的最大值 3.定义一个函数,输入三个值,找出三个数中的平均值 4.定义一个函数,计算一个数的 N 次方 Pow(2, 3)返回8 5.传入十一…...
Node.js 的底层原理
Node.js 的底层原理 1. 事件驱动和非阻塞 I/O Node.js 基于 Chrome V8 引擎,使用 JavaScript 作为开发语言。它采用事件驱动和非阻塞 I/O 模型,使其轻量且高效。通过 libuv 库实现跨平台的异步 I/O,包括文件操作、网络请求等。 2. 单线程事…...
react native在windows环境搭建并使用脚手架新建工程
截止到2024-1-11,使用的主要软件的版本如下: 软件实体版本react-native0.77.0react18.3.1react-native-community/cli15.0.1Android Studio2022.3.1 Patch3Android SDKAndroid SDK Platform 34 35Android SDKAndroid SDK Tools 34 35Android SDKIntel x…...
实战:如何快速让新网站被百度收录?
本文来自:百万收录网 原文链接:https://www.baiwanshoulu.com/22.html 要让新网站快速被百度收录,可以采取以下实战策略: 一、网站基础优化 网站结构清晰:确保网站的结构简洁清晰,符合百度的抓取规则。主…...
Nuxt:利用public-ip这个npm包来获取公网IP
目录 一、安装public-ip包1.在Vue组件中使用2.在Nuxt.js插件中使用public-ip 一、安装public-ip包 npm install public-ip1.在Vue组件中使用 你可以在Nuxt.js的任意组件或者插件中使用public-ip来获取公网IP。下面是在一个Vue组件中如何使用它的例子: <template…...
572. 另一棵树的子树
前导题:100. 相同的树 回顾一下 判断两棵二叉树相同,根结点相同 且 左子树相同 且 右子树相同。 于是判断如下: 根结点都为null,返回true根结点不都为null,返回false根结点都不为null,但是值不相同&#…...
LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略
LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略 目录 STORM系统简介 1、Co-STORM 2、更新新闻 STORM系统安装和使用方法 1、安装 pip安装 直接克隆GitHub仓库 2、模型和数据集 两个数据集 FreshWiki数据集 WildSeek数据集 支持…...
菜鸟之路Day11-12一一集合进阶(四)
菜鸟之路Day11-12一一集合进阶(四) 作者:blue 时间:2025.1.29-1.30 文章目录 菜鸟之路Day11-12一一集合进阶(四)0.概述1.可变参数2.Collections3.综合练习4.不可变的集合5.Stream流 0.概述 内容学习自黑…...
在Ubuntu下编译VLC
参考链接: https://blog.csdn.net/zyhse/article/details/113662686...
python开发,最好的环境是什么
目录 1. 集成开发环境(IDE) 1.1 PyCharm 1.2 Visual Studio Code (VSCode) 2. 文本编辑器 2.1 Sublime Text 2.2 Vim/NeoVim 3. 虚拟环境管理 4. 版本控制与协作 5. 容器化开发 6. 项目管理与依赖管理工具 7. 单元测试与调试 最佳组合推荐 …...
Maui学习笔记- SQLite简单使用案例02添加详情页
我们继续上一个案例,实现一个可以修改当前用户信息功能。 当用户点击某个信息时,跳转到信息详情页,然后可以点击编辑按钮导航到编辑页面。 创建项目 我们首先在ViewModels目录下创建UserDetailViewModel。 实现从详情信息页面导航到编辑页面…...
创建前端项目的方法
目录 一、创建前端项目的方法 1.前提:安装Vue CLI 2.方式一:vue create项目名称 3.方式二:vue ui 二、Vue项目结构 三、修改Vue项目端口号的方法 一、创建前端项目的方法 1.前提:安装Vue CLI npm i vue/cli -g 2.方式一&…...
好用的AI/解析网站
文件解析 json文件解析:http://www.yunjson.com/jsoncheck/...
C语言练习(31)
有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。 设5名学生的学号、姓名和3门课程成绩如下&am…...
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL TLS/SSL协议和应用层协议无关,它只是加密应用层协议(比如HTTP)并传递给下层的TCP。 HTTP和TLS/SSL协议组合在一起就是HTTPS, HTTPS等…...
SpringBoot AOP 和 事务
SpringBoot 整合 AOP 动态代理技术 JDK 动态代理 JDK 动态代理是 Java 自带的一种代理方式。它要求目标类必须有接口,基于这个接口,JDK 在运行时会动态生成一个代理对象。这个代理对象和目标对象就像 “拜把子” 的兄弟,因为它们都实现了相同…...
如何使用Python调用大语言模型的API接口?
以下是使用 Python 调用几种常见大语言模型 API 接口的详细步骤和示例代码: 1. 调用 OpenAI 的 GPT 模型 API OpenAI 提供了强大的 GPT 系列模型,使用其 API 需要先注册 OpenAI 账号并获取 API 密钥。 步骤: 安装openai库:pip…...
如何监控ubuntu系统某个程序的运行状态,如果程序出现异常,对其自动重启。
在Ubuntu系统中,可以通过编写脚本结合cron或systemd来监控程序的运行状态,并在程序异常时自动重启。以下是具体步骤: 方法一:使用Shell脚本和Cron 编写监控脚本 创建一个Shell脚本来检查程序是否运行,并在程序异常时重…...
Kafka 压缩算法详细介绍
文章目录 一 、Kafka 压缩算法概述二、Kafka 压缩的作用2.1 降低网络带宽消耗2.2 提高 Kafka 生产者和消费者吞吐量2.3 减少 Kafka 磁盘存储占用2.4 减少 Kafka Broker 负载2.5 降低跨数据中心同步成本 三、Kafka 压缩的原理3.1 Kafka 压缩的基本原理3.2. Kafka 压缩的工作流程…...
启元世界(Inspir.ai)技术浅析(二):深度强化学习
深度强化学习(Deep Reinforcement Learning, DRL)是启元世界在人工智能领域的一项核心技术,广泛应用于游戏AI、智能决策等领域。 一、状态(State) 1.1 概念与作用 **状态(State)**是指智能体对环境的感知,是智能体进行决策的基础。在深度强化学习中,状态通常是一个高…...
在K8s中部署动态nfs存储provisioner
背景 之前,我已经在一台worker node上安装了local lvm 的provisioner来模拟需要本地高IOPS的数据库等stafeful应用的实现。 为了后续给虚拟机里的K8s集群安装可用的metrics和logs监控系统(metrics和logs的时序数据库需要永久存储)࿰…...
SQL注入漏洞之绕过[前端 服务端 waf]限制 以及 防御手法 一篇文章给你搞定
目录 绕过手法 前端代码绕过 后端代码绕过 各种字段进行验证 union 大小写绕过 双写逃过 强制类型判断 引号特殊编码处理。 内联注释绕过 注释符绕过 or/and绕过 空格绕过 防御SQL注入的方法 使用预编译语句 使用存储过程 检查数据类型 绕过手法 前端代码绕过…...
C++ 写一个简单的加减法计算器
************* C topic:结构 ************* Structure is a very intersting issue. I really dont like concepts as it is boring. I would like to cases instead. If I want to learn something, donot hesitate to make shits. Like building a house. Wh…...
Effective C++ 规则50:了解 new 和 delete 的合理替换时机
1、背景 在 C 中,new 和 delete 是动态分配内存的核心操作符。然而,直接使用它们有时会增加程序的复杂性,甚至导致内存泄漏和其他问题。因此,了解何时替换 new 和 delete 并选择更适合的内存管理策略,是编写高效、健壮…...
水果实体店品牌数字化:RWA + 智能体落地方案
一、方案背景 随着数字化技术的迅猛发展,实体零售行业正面临前所未有的挑战与机遇。传统的零售模式难以满足消费者对个性化、便捷化、智能化的需求,尤其是在水果等生鲜商品领域,如何通过技术手段提升运营效率、增强顾客体验、拓宽盈利模式&a…...
Docker小游戏 | 使用Docker部署FC-web游戏模拟器
Docker小游戏 | 使用Docker部署FC-web游戏模拟器 前言一、项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署FC-web游戏模拟器下载镜像创建容器检查容器状态检查服务端口安全设置四、访问FC-web游戏模拟器试玩游戏FC游戏的操作方法…...
【视频+图文详解】HTML基础3-html常用标签
图文教程 html常用标签 常用标签 1. 文档结构 <!DOCTYPE html>:声明HTML文档类型。<html>:定义HTML文档的根元素。<head>:定义文档头部,包含元数据。<title>:设置网页标题,浏览…...
年化19.3%策略集|ctpbee_api替换成openctp整合backtrader实盘方案(代码+数据)
原创内容第782篇,专注量化投资、个人成长与财富自由。 昨天我们把backtraderctpbee的实盘整合代码跑通了,年化19.3%,回撤仅8%的实盘策略,以及backtrader整合CTPBee做实盘(附python代码和数据) 这两周我们加…...
谭浩强C语言程序设计(3) 7章
1、递归实现N的阶乘 c复制 #include <cstdio> // 包含标准输入输出库// 计算n的阶乘 int total 0; // 定义全局变量total用于存储阶乘结果// 递归函数计算阶乘 int fac(int a){// 如果输入的数小于0,输出错误信息if (a < 0){printf("%d < 0,err…...
国产SiC碳化硅功率器件技术成为服务器电源升级的核心引擎
在服务器电源应用中,国产650V碳化硅(SiC)MOSFET逐步取代传统超结(Super Junction, SJ)MOSFET,其核心驱动力源于SiC材料在效率、功率密度、可靠性和长期经济性上的显著优势,叠加产业链成熟与政策…...
深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据
深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据 一、服务器如何响应前端请求 前端与后端的交互主要通过 HTTP 协议实现。以下是详细步骤: 1. 前端发起 HTTP 请求 GET 请求:用于从服务器获取数据。POST 请求:用…...
深度学习指标可视化案例
TensorBoard 代码案例:from torch.utils.tensorboard import SummaryWriter import torch import torchvision from torchvision import datasets, transforms# 设置TensorBoard日志路径 writer SummaryWriter(runs/mnist)# 加载数据集 transform transforms.Comp…...
unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等
目录 1 场景数量 SceneManager.sceneCount 2 直接代码生成新场景 SceneManager.CreateScene 3 场景的加载 3.1 用代码加载场景,仍然build setting里先加入配置 3.2 卸载场景 SceneManager.UnloadSceneAsync(); 3.3 同步加载场景 SceneManager.LoadScene 3.3.…...
网易云音乐歌名可视化:词云生成与GitHub-Pages部署实践
引言 本文将基于前一篇爬取的网易云音乐数据, 利用Python的wordcloud、matplotlib等库, 对歌名数据进行深入的词云可视化分析. 我们将探索不同random_state对词云布局的影响, 并详细介绍如何将生成的词云图部署到GitHub Pages, 实现数据可视化的在线展示. 介绍了如何从原始数据…...
Web-3.0(Solidity)基础教程
Solidity 是 以太坊智能合约编程语言,用于编写 去中心化应用(DApp)。如果你想开发 Web3.0 应用,Solidity 是必学的。 Remix - Ethereum IDE(在线编写 Solidity) 特性Remix IDEHardhat适用场景适合 初学者 …...
android获取EditText内容,TextWatcher按条件触发
android获取EditText内容,TextWatcher按条件触发 背景:解决方案:效果: 背景: 最近在尝试用原生安卓实现仿element-ui表单校验功能,其中涉及到EditText组件内容的动态校验,初步实现功能后&#…...
题单:冒泡排序1
题目描述 给定 n 个元素的数组(下标从 1 开始计),请使用冒泡排序对其进行排序(升序)。 请输出每一次冒泡过程后数组的状态。 要求:每次从第一个元素开始,将最大的元素冒泡至最后。 输入格式…...
我的毕设之路:(2)系统类型的论文写法
一般先进行毕设的设计与实现,再在现成毕设基础上进行描述形成文档,那么论文也就成形了。 1 需求分析:毕业设计根据开题报告和要求进行需求分析和功能确定,区分贴合主题的主要功能和拓展功能能,删除偏离无关紧要的功能…...
JVM_类的加载、链接、初始化、卸载、主动使用、被动使用
①. 说说类加载分几步? ①. 按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段: 第一过程的加载(loading)也称为装载验证、准备、解析3个部分统称为链接(Linking)在Java中数据类型分为基本数据类型和引用数据…...
数论问题79一一研究成果
(豆包智能搜索一一李扩继) 李扩继是一位在数学研究尤其是哥德巴赫猜想研究领域有一定成果的中学老师,以下是关于他的具体介绍: ①研究经历:2006年承担咸阳市教研室的立项课题《角谷猜想的研究》,虽未完成角谷猜想的证明ÿ…...
【DeepSeek-V3】AI Model Evaluation Framework and index schedule AI模型能力评价指标及对比
文章目录 AI 模型评估体系 | AI Model Evaluation Framework1. 模型架构信息 | Model Architecture Information2. 英语能力评估 | English Language Proficiency3. 编程能力评估 | Programming Capability Metrics4. 数学能力评估 | Mathematical Capability Assessment5. 中文…...
《程序人生》工作2年感悟
一些杂七杂八的感悟: 1.把事做好比什么都重要, 先树立量良好的形象,再横向发展。 2.职场就是人情世故,但也不要被人情世故绑架。 3.要常怀感恩的心,要记住帮助过你的人,愿意和你分享的人,有能力…...
Elasticsearch的开发工具(Dev Tools)
目录 说明1. **Console**2. **Search Profiler**3. **Grok Debugger**4. **Painless Lab**总结 说明 Elasticsearch的开发工具(Dev Tools)在Kibana中提供了多种功能强大的工具,用于调试、优化和测试Elasticsearch查询和脚本。以下是关于Cons…...
22_解析XML配置文件_List列表
解析XML文件 需要先 1.【加载XML文件】 而 【加载XML】文件有两种方式 【第一种 —— 使用Unity资源系统加载文件】 TextAsset xml Resources.Load<TextAsset>(filePath); XmlDocument doc new XmlDocument(); doc.LoadXml(xml.text); 【第二种 —— 在C#文件IO…...
智慧园区管理平台实现智能整合提升企业运营模式与管理效率
内容概要 在当今数字化的背景下,智慧园区管理平台正逐渐成为企业提升运营效率和管理模式的重要工具。这个平台汇聚了多种先进技术,旨在通过智能整合各类资源与信息,帮助企业实现全面的管理创新。 智慧园区管理平台不仅仅是一个数据处理工具…...
从规则到神经网络:机器翻译技术的演进与未来展望
从规则到神经网络:机器翻译技术的演进与未来展望 引言 还记得早些年用翻译软件翻译一句简单的英文句子,却发现翻译结果让人啼笑皆非的日子吗?从“我喜欢吃苹果”被翻译成“我喜欢吃苹果电脑”,到今天的神经网络机器翻译(Neural Machine Translation, NMT)能够生成语义流…...
[MySQL]事务的隔离级别原理与底层实现
目录 1.为什么要有隔离性 2.事务的隔离级别 读未提交 读提交 可重复读 串行化 3.演示事务隔离级别的操作 查看与设置事务的隔离级别 演示读提交操作 演示可重复读操作 1.为什么要有隔离性 在真正的业务场景下,MySQL服务在同一时间一定会有大量的客户端进程…...
hdfs:介绍三个脚本
1、jps-cluster.sh 如果我们想在Bigdata01 这台电脑上,查看整个集群的服务启动情况,可以使用这个脚本文件。 #!/bin/bash USAGE"使⽤⽅法:sh jps-cluster.sh" NODES("bigdata01" "bigdata02" "bigdata03…...
【Oracle篇】使用Hint对优化器的执行计划进行干预(含单表、多表、查询块、声明四大类Hint干预)
💫《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨ 💫《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(…...