【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.30 性能巅峰:NumPy代码优化全攻略

在这里插入图片描述

1.30 性能巅峰:NumPy代码优化全攻略

目录
性能巅峰:NumPy代码优化全攻略
向量化操作的黄金法则
循环优化的JIT编译方案
多线程与多进程加速
分布式计算的Dask集成
性能剖析火焰图解读
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 火焰图的解读技巧
性能巅峰:NumPy代码优化全攻略
向量化法则
JIT加速
并行计算
分布式扩展
广播机制
UFunc应用
内存布局
Numba实战
类型推断
并行模式
多线程
多进程
GIL处理
Dask架构
分块算法
任务调度

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()  # 自动分配至集群计算
分块算法原理
原始数据
分块存储
任务调度
Worker计算
结果聚合

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)是分析程序运行时性能的一种技术,通过性能剖析可以找出程序中的性能瓶颈。常见的性能剖析工具包括cProfileline_profileryappi等。

  • 性能剖析的定义:性能剖析是指对程序运行时的行为进行分析,以找出性能瓶颈。
  • 性能剖析的目标:通过性能剖析,我们可以优化代码,提高程序的执行效率。
  • 常用工具
    • cProfile:Python内置的性能剖析工具,可以生成详细的性能报告。
    • line_profiler:用于逐行性能剖析的工具,可以精确到每一行代码的执行时间。
    • yappi:一个高效的性能剖析工具,支持多线程和多进程性能分析。
1.30.5.2 使用火焰图进行性能分析

火焰图是一种可视化工具,通过图形化的方式展示程序的性能剖析结果,帮助我们更直观地理解性能瓶颈。

  • 火焰图的定义:火焰图是一种可视化工具,通过堆栈帧的形式展示程序的性能剖析结果。
  • 火焰图的优势:火焰图可以清晰地展示函数调用的层次关系,以及每一层函数的执行时间,帮助我们快速定位性能瓶颈。
1.30.5.3 火焰图的解读技巧

解读火焰图需要理解其基本结构和颜色编码。

  1. 堆栈帧

    • 层次关系:火焰图从上到下展示函数调用的层次关系,每一层表示一个函数调用。
    • 宽度:每个堆栈帧的宽度表示该函数的执行时间,宽度越大表示时间越长。
    • 高度:堆栈帧的高度表示调用深度,越低的堆栈帧表示调用层次越深。
  2. 颜色编码

    • 颜色:火焰图的颜色编码可以表示不同的函数类型或执行时间。
    • 常见颜色
      • 红色:表示执行时间较长的函数。
      • 蓝色:表示执行时间较短的函数。
      • 绿色:表示用户定义的函数。
  3. 查找热点

    • 热点函数:火焰图中最宽的堆栈帧表示热点函数,这些函数是性能优化的重点。
    • 深度分析:点击火焰图中的堆栈帧可以查看更详细的函数调用信息。
1.30.5.4 生成火焰图

生成火焰图需要使用性能剖析工具和可视化工具。下面是一个使用cProfileflamegraph生成火焰图的示例。

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')
  • 性能剖析:使用cProfileexample_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分布式计算以及性能剖析和火焰图解读。这些方法不仅能够显著提高代码的执行效率,还能使代码更加简洁易读。希望通过本文的介绍,您能够在实际项目中应用这些技术,提升程序的性能。

参考文献

序号名称链接
1NumPy官方文档NumPy官网
2Numba官方文档Numba官网
3Dask官方文档Dask官网
4Python cProfile库官方文档Python cProfile官方文档
5flamegraph工具官方文档FlameGraph GitHub
6threading模块官方文档Python threading官方文档
7multiprocessing模块官方文档Python multiprocessing官方文档
8全局解释器锁(GIL)Python GIL Wikipedia
9并行计算的概念Parallel Computing
10计算机性能优化基礎Performance Optimization Basics
11Python性能剖析指南Python Profiling Guide
12火焰图入门Introduction to Flame Graphs
13火焰图高级解读Advanced Flame Graphs Interpretation
14NumPy性能优化技巧NumPy Performance Optimization
15Dask性能优化文档Dask Performance Optimization

这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9828.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

白嫖DeepSeek:一分钟完成本地部署AI

1. 必备软件 LM-Studio 大模型客户端DeepSeek-R1 模型文件 LM-Studio 是一个支持众多流行模型的AI客户端,DeepSeek是最新流行的堪比GPT-o1的开源AI大模型。 2. 下载软件和模型文件 2.1 下载LM-Studio 官方网址:https://lmstudio.ai 打开官网&#x…

冲刺蓝桥杯之速通vector!!!!!

文章目录 知识点创建增删查改 习题1习题2习题3习题4:习题5: 知识点 C的STL提供已经封装好的容器vector,也可叫做可变长的数组,vector底层就是自动扩容的顺序表,其中的增删查改已经封装好 创建 const int N30; vecto…

mysql_init和mysql_real_connect的形象化认识

解析总结 1. mysql_init 的作用 mysql_init 用于初始化一个 MYSQL 结构体,为后续数据库连接和操作做准备。该结构体存储连接配置及状态信息,是 MySQL C API 的核心句柄。 示例: MYSQL *conn mysql_init(NULL); // 初始化连接句柄2. mysql_…

C++中常用的排序方法之——冒泡排序

成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C中常用的排序方法之——冒泡排序的…

ARM嵌入式学习--第十天(UART)

--UART介绍 UART(Universal Asynchonous Receiver and Transmitter)通用异步接收器,是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括与监控…

解锁微服务:五大进阶业务场景深度剖析

目录 医疗行业:智能诊疗的加速引擎 电商领域:数据依赖的破局之道 金融行业:运维可观测性的提升之路 物流行业:智慧物流的创新架构 综合业务:服务依赖的优化策略 医疗行业:智能诊疗的加速引擎 在医疗行业迈…

基于Flask的旅游系统的设计与实现

【Flask】基于Flask的旅游系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为后端开发语言,结合前端Bootstrap框架,为用户提供了丰富…

《HelloGitHub》第 106 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、…

一文讲解Java中的BIO、NIO、AIO之间的区别

BIO、NIO、AIO是Java中常见的三种IO模型 BIO:采用阻塞式I/O模型,线程在执行I/O操作时被阻塞,无法处理其他任务,适用于连接数比较少的场景;NIO:采用非阻塞 I/O 模型,线程在等待 I/O 时可执行其…

Linux——网络(tcp)

文章目录 目录 文章目录 前言 一、TCP逻辑 1. 面向连接 三次握手(建立连接) 四次挥手(关闭连接) 2. 可靠性 3. 流量控制 4. 拥塞控制 5. 基于字节流 6. 全双工通信 7. 状态机 8. TCP头部结构 9. TCP的应用场景 二、编写tcp代码函数…

Flutter使用Flavor实现切换环境和多渠道打包

在Android开发中通常我们使用flavor进行多渠道打包,flutter开发中同样有这种方式,不过需要在原生中配置 具体方案其实flutter官网个了相关示例(https://docs.flutter.dev/deployment/flavors),我这里记录一下自己的操作 Android …

MySQL备忘录

MySQL 的一些基础知识记录,包括一些配置文件,cmd命令等 前言 这里使用的MySQL版本是8.0.25 MySQL安装,包括相关配置文件文本内容,相关cmd命令 通过安装包配置环境变量使用cmd管理员权限通过命令安装MySQL 8.0.25 一、安装配置 …

Prompt提示词完整案例:让chatGPT成为“书单推荐”的高手

大家好,我是老六哥,我正在共享使用AI提高工作效率的技巧。欢迎关注我,共同提高使用AI的技能,让AI成功你的个人助理。 许多人可能会跟老六哥一样,有过这样的体验:当我们遇到一个能力出众或对事物有独到见解的…

Maui学习笔记- SQLite简单使用案例02添加详情页

我们继续上一个案例,实现一个可以修改当前用户信息功能。 当用户点击某个信息时,跳转到信息详情页,然后可以点击编辑按钮导航到编辑页面。 创建项目 我们首先在ViewModels目录下创建UserDetailViewModel。 实现从详情信息页面导航到编辑页面…

Linux文件原生操作

Linux 中一切皆文件,那么 Linux 文件是什么? 在 Linux 中的文件 可以是:传统意义上的有序数据集合,即:文件系统中的物理文件 也可以是:设备,管道,内存。。。(Linux 管理的一切对象…

HttpClient学习

目录 一、概述 二、HttpClient依赖介绍 1.导入HttpClient4依赖 2.或者导入HttpClient5依赖 3.二者区别 三、HttpClient发送Get请求和Post请求测试 (一)通过HttpClient发送Get请求 (二)通过HttpClient发送Post请求 一、概述 HttpClient是 Apache 软件基金会提供的一…

【重生之我在学习C语言指针详解】

目录 ​编辑 --------------------------------------begin---------------------------------------- 引言 一、指针基础 1.1 内存地址 1.2 指针变量 1.3 指针声明 1.4 取地址运算符 & 1.5 解引用运算符 *** 二、指针运算 2.1 指针加减运算 2.2 指针关系运算 三…

< OS 有关> BaiduPCS-Go 程序的 菜单脚本 Script: BaiduPCS-Go.Menu.sh (bdgo.sh)

目标: 使用 日本阿里云的 VPM 传输文件。 暂时方案: 使用 主机JPN 下载 https://huggingface.co/ 上模型从 JPN 放到 度狗上在家里从狗度下载 为了减少编程,尽量使用现在软件 ,就找到 GitHub - qjfoidnh/BaiduPCS-Go: iikira…

98.1 AI量化开发:长文本AI金融智能体(Qwen-Long)对金融研报大批量处理与智能分析的实战应用

目录 0. 承前1. 简介1.1 通义千问(Qwen-Long)的长文本处理能力 2. 基础功能实现2.1 文件上传2.2 单文件分析2.3 多文件分析 3. 汇总代码&运行3.1 封装的工具函数3.2 主要功能特点3.3 使用示例3.4 首次运行3.5 运行结果展示 4. 注意事项4.1 文件要求4.2 错误处理机制4.3 最佳…

Linux环境基础开发工具的使用(apt, vim, gcc, g++, gbd, make/Makefile)

目录 什么是软件包 Linux 软件包管理器 apt 认识apt 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式下各指令汇总 vim底行模式个指令汇总 Linux编译器 - gcc/g gcc/g的作…