「代码厨房大揭秘:Python性能优化的烹饪秘籍!」

哈喽,我是阿佑,上篇咱们讲了 Socket 编程 —— 探索Python Socket编程,赋予你的网络应用隐形斗篷般的超能力!从基础到实战,构建安全的聊天室和HTTP服务器,成为网络世界的守护者。加入我们,一起揭开Socket编程的神秘面纱,让学习变得不再枯燥!

文章目录

    • 1. 引言
      • 为什么性能优化至关重要
      • Python性能瓶颈的常见来源
    • 2. 背景介绍
      • 2.1 Python解释器与执行模型
      • 2.2 性能测试基础
    • 3. 代码层面的性能优化
      • 3.1 数据结构与算法选择
      • 3.2 减少全局变量与动态属性查找
      • 3.3 避免不必要的计算与重复操作
    • 4. 库与模块优化
      • 4.1 使用高效库替换低效代码
      • 4.2 并发与并行处理
    • 5. 内存管理与垃圾回收
      • 5.1 了解Python内存模型
      • 5.2 手动管理与垃圾回收调整
    • 6. 外部依赖与C扩展
      • 6.1 使用Cython编写关键部分
      • 6.2 利用C/C++扩展加速
    • 7. 性能分析与调试工具
      • 7.1 cProfile与profiling基础
      • 7.2 使用vmprof与gprof进行更深入分析
    • 8. 结论
      • 综合策略在实际项目中的应用
      • 持续性能优化的思考
    • 9. 参考文献

1. 引言

为什么性能优化至关重要

想象一下,你是一个程序员,手里拿着一把锋利的Python之剑,准备在代码的海洋中航行。但是,如果你的剑不够快,不够锋利,那么在面对复杂的算法和庞大的数据时,你可能就会陷入困境。这就是性能优化的重要性所在——它能让你的剑更加锋利,让你在代码的海洋中乘风破浪。

Python性能瓶颈的常见来源

在Python的世界里,性能瓶颈就像是那些隐藏在暗处的小怪兽,它们悄悄地消耗着你的计算资源,让你的程序变得缓慢。常见的性能瓶颈来源包括:

  • 全局解释器锁(GIL):这是Python中的一个守护神,它保护着Python的线程安全,但也限制了多线程程序的性能。
  • 不合适的数据结构:如果你选择了错误的数据结构,就像选择了一个不适合的剑来战斗,效率自然低下。
  • 低效的算法:算法就像是你的战斗技巧,如果技巧不佳,即使剑再锋利,也无法发挥出应有的力量。
  • 内存管理不善:如果你的内存管理不善,就像是在战斗中不断丢失你的剑,这会严重影响你的战斗效率。

在接下来的旅程中,阿佑将和大家们一起探索如何优化Python的性能,就像是一个剑术大师,教你如何磨炼你的剑,让它在代码的海洋中更加闪耀。现在,让我们开始这段旅程,一步步揭开性能优化的神秘面纱。

在这里插入图片描述

2. 背景介绍

2.1 Python解释器与执行模型

在Python的世界里,我们有各种各样的解释器,它们就像是不同的魔法师,帮助我们执行代码。其中最著名的就是CPython,它是Python的官方和最常用的实现。CPython的工作原理就像是魔法师的咒语,它将你的Python代码转换成机器能够理解的语言。

但是,CPython有一个著名的“魔法限制”——全局解释器锁(GIL)。GIL就像是魔法师的法杖,它确保了在任何时刻只有一个线程能够执行Python字节码。这听起来很安全,但这也意味着即使你有一把强大的多核处理器之剑,你的程序也可能因为GIL而无法发挥出全部的力量。

2.2 性能测试基础

在性能优化的旅程中,你需要一个指南针来指引你——这就是性能测试。性能测试就像是你手中的地图,帮助你找到代码中的低效区域。基准测试是一种常见的性能测试方法,它通过测量程序在执行特定任务时的性能来评估其效率。

性能衡量工具就像是你的罗盘和望远镜,帮助你更准确地导航和观察。这些工具可以是简单的计时器,也可以是复杂的分析器,它们能够提供关于程序执行时间、内存使用情况等的详细信息。

现在,我们已经了解了Python的执行模型和性能测试的基础。接下来,我们将深入到代码层面,探索如何通过优化数据结构和算法来提升性能。就像是一个剑术大师,不仅要有一把锋利的剑,还要有精准的剑法。让我们一起继续这段旅程,揭开性能优化的更多秘密。

3. 代码层面的性能优化

3.1 数据结构与算法选择

想象一下,你是一个厨师,面前有一堆食材,你需要做出一顿美味的晚餐。如果你选择了正确的食材和烹饪方法,那么晚餐就会更加美味且制作效率更高。在Python编程中,选择正确的数据结构和算法也是同样的道理。

有效利用内置数据结构

Python为我们提供了丰富的内置数据结构,比如列表(list)、字典(dict)、集合(set)等。它们就像是厨房里的各种工具和食材,用得好,可以让你的代码更加高效。

比如,如果你需要频繁地检查一个元素是否存在,使用集合(set)而不是列表(list)会更快,因为集合是基于哈希表实现的,它的查找效率是O(1),而列表的查找效率是O(n)。

算法效率提升策略

算法就像是你的烹饪技巧,好的算法可以让程序运行得更快。一个简单的例子是排序算法,如果你的数据量不大,使用Python内置的sorted()函数就已经足够高效了。但如果数据量很大,你可能需要考虑使用更高效的算法,比如快速排序或归并排序。

3.2 减少全局变量与动态属性查找

全局变量和动态属性查找就像是你在做一道菜时,不停地在厨房里跑来跑去找调料。这不仅会降低你的烹饪效率,还可能让你的厨房变得一团糟。

作用域对性能的影响

局部变量的访问速度比全局变量快得多,因为局部变量存储在栈上,而全局变量存储在堆上。所以,尽量减少全局变量的使用,多使用局部变量。

使用局部变量与缓存查找结果

缓存查找结果就像是你把常用的调料放在手边,这样你就可以快速地拿到它们,而不需要每次都去柜子里翻找。在Python中,你可以使用functools.lru_cache装饰器来实现缓存功能,它可以自动存储函数的最近调用结果,避免重复计算。

3.3 避免不必要的计算与重复操作

想象一下,你在做一道菜时,不停地重复切洋葱,这不仅浪费时间和精力,还可能让你泪流满面。在编程中,避免不必要的计算和重复操作也是非常重要的。

延迟计算与缓存技术

延迟计算就像是你不需要立刻切洋葱,而是等到真正需要的时候再切。在Python中,你可以使用生成器(generator)来实现延迟计算,只在需要的时候才生成数据。

循环优化与列表推导式

循环优化就像是你在做一道菜时,尽量减少不必要的步骤。列表推导式(list comprehension)是一种优雅且高效的方式来创建列表,它通常比传统的循环更简洁、更快。

举个例子,使用列表推导式来创建一个包含平方数的列表:

squares = [x**2 for x in range(10)]

这比使用传统的for循环来创建同样的列表要简洁得多。

通过这些技巧,你可以让你的代码更加高效,就像是一个熟练的厨师,用最少的时间和精力做出最美味的晚餐。接下来,我们将探索如何通过使用高效的库和模块来进一步提升Python程序的性能。

4. 库与模块优化

4.1 使用高效库替换低效代码

在Python的世界里,我们有各种强大的库和模块,它们就像是你厨房里的各种高级料理机,能够帮你快速完成复杂的任务。

推荐的高性能库介绍

比如说,如果你需要处理大量的数据,numpypandas就是你的得力助手。numpy是一个用于科学计算的库,它提供了高度优化的多维数组对象和相应的操作。而pandas则是一个数据分析库,它提供了DataFrame对象,让你可以像操作Excel表格一样轻松处理数据。

举个例子,如果你需要对一组数据求和,使用numpy可以这样写:

import numpy as npdata = np.array([1, 2, 3, 4, 5])
total = np.sum(data)
print("总和是:", total)

这比使用Python原生的列表和循环要快得多。

numpy与pandas的高效数据处理

numpypandas之所以高效,是因为它们底层是用C语言编写的,这意味着它们的执行速度可以和C语言相媲美。使用这些库,你可以轻松处理大规模的数据集,而不必担心性能问题。

4.2 并发与并行处理

并发和并行处理就像是你在厨房里同时使用多个炉灶和烤箱,可以同时烹饪多道菜,大大提升效率。

threading与multiprocessing模块的正确使用

在Python中,threading模块可以让你创建线程,实现任务的并发执行。但是,由于GIL的存在,多线程在CPU密集型任务中可能不会带来太大的性能提升。这时,multiprocessing模块就显得尤为重要,它通过创建多个进程来绕过GIL的限制,实现真正的并行计算。

举个例子,如果你需要对一个大数组进行处理,使用multiprocessing可以这样写:

from multiprocessing import Pooldef process_data(data):# 这里是处理数据的函数return sum(data)if __name__ == "__main__":with Pool(4) as p:  # 创建一个进程池,4个进程result = p.map(process_data, [list(range(10000)) for _ in range(10)])print("处理结果:", sum(result))

这段代码创建了一个进程池,并使用map方法并行处理数据。

asyncio与异步I/O编程

如果你的任务主要是I/O密集型的,比如网络请求或文件操作,那么asyncio模块将是你的好帮手。它可以让你的程序在等待I/O操作完成时,继续执行其他任务,从而提升效率。

举个例子,使用asyncio进行网络请求可以这样写:

import asyncio
import aiohttpasync def fetch_url(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.text()async def main():urls = ['http://example.com', 'http://example.org']tasks = [fetch_url(url) for url in urls]print(await asyncio.gather(*tasks))asyncio.run(main())

这段代码使用asyncioaiohttp库并发地获取多个网页的内容。

通过合理使用这些库和模块,你的Python程序可以像一个高效的厨房,快速且优雅地完成任务。接下来,我们将探索如何通过内存管理和垃圾回收来进一步提升程序的性能。

在这里插入图片描述

5. 内存管理与垃圾回收

5.1 了解Python内存模型

想象一下,你的电脑内存就像是一个大型超市,里面存放着各种各样的商品——也就是你的数据和对象。Python内存模型就像是超市的管理系统,它负责管理这些商品的存取和回收。

对象生命周期与引用计数

每个商品都有一个标签,上面写着它被多少人需要。在Python中,这就像是对象的引用计数。每当一个对象被引用,计数器就加一;每当引用被删除,计数器就减一。当计数器降到零时,就意味着没有人再需要这个对象,它就可以被回收了。

引用计数虽然简单有效,但也存在一些问题。比如,当两个对象相互引用时,即使它们不再被外界需要,它们的引用计数也不会降到零,这就是所谓的循环引用问题。

优化内存占用与避免内存泄漏

内存泄漏就像是超市里那些过期的商品,它们占用空间,但又不能被卖出去。在Python中,内存泄漏通常是由于不正确的资源管理造成的。为了避免内存泄漏,你需要确保不再需要的对象能够被及时回收。

5.2 手动管理与垃圾回收调整

使用del与弱引用

就像超市定期清理过期商品一样,你也可以使用del语句来手动删除不再需要的对象,释放它们占用的内存。此外,Python还提供了弱引用(weakref)模块,它允许你创建对对象的引用,但不会增加对象的引用计数。当对象被回收时,弱引用会自动失效。

举个例子,使用弱引用可以这样写:

import weakrefclass MyClass:passobj = MyClass()
weak_obj = weakref.ref(obj)del obj  # 删除对象,引用计数降到0
print(weak_obj())  # 返回None,因为对象已经被回收

调整GC策略提升性能

Python的垃圾收集器(GC)就像是超市的清洁工,它会定期清理那些过期的商品。但是,如果你的超市(程序)非常大,那么清洁工的工作就会变得非常重要。Python的GC默认是开启的,但你可以通过调整GC的策略来优化性能。

比如,你可以设置垃圾收集器的阈值,控制它何时运行:

import gcgc.set_threshold(700, 10, 5)  # 设置三个阈值参数

这就像是告诉清洁工,当过期商品达到700件时,就开始清理,每次清理10件,直到剩余5件为止。

通过合理管理内存和调整垃圾收集策略,你的Python程序可以运行得更加顺畅,就像是一个高效运转的超市,既不会浪费空间,也不会让顾客(用户)等待太久。接下来,我们将探索如何通过外部依赖和C扩展来进一步提升程序的性能。

6. 外部依赖与C扩展

6.1 使用Cython编写关键部分

在Python的世界里,我们经常会遇到一些性能瓶颈,就像是一个跑步运动员遇到了一块难以跨越的障碍。这时,Cython就像是一把神奇的钥匙,它能够帮你打开性能提升的大门。

Cython简介与性能提升案例

Cython是一种将Python代码编译成C语言代码的工具,从而让你的Python程序能够像C语言程序一样快速运行。使用Cython,你可以编写那些性能关键部分的代码,比如数值计算密集型的任务。

举个例子,假设你需要对一个大数组进行一些数值计算,使用Cython可以这样写:

# cython: language_level=3cpdef double sum_array(double[:] arr):cdef int i, n = arr.shape[0]cdef double s = 0for i in range(n):s += arr[i]return s

这段代码定义了一个Cython函数sum_array,它接受一个NumPy数组作为参数,并计算数组的总和。通过使用cpdef,这个函数既可以被Python调用,也可以被Cython调用。

6.2 利用C/C++扩展加速

如果你觉得Cython还不够快,或者你需要使用一些现有的C/C++库,那么编写Python的C/C++扩展可能是一个更好的选择。

Python FFI接口与ctypes使用

ctypes是Python的一个外部函数接口,它允许你调用C语言写的动态链接库。使用ctypes,你可以轻松地将C/C++代码集成到Python程序中。

举个例子,假设你有一个C语言写的动态链接库libexample.so,里面有一个函数add,你可以这样使用它:

from ctypes import cdlllib = cdll.LoadLibrary("./libexample.so")
result = lib.add(1, 2)  # 调用C语言的add函数
print("结果是:", result)

编写C扩展模块

如果你需要更深入地集成C/C++代码,或者想要创建一个可以被其他Python程序重复使用的模块,那么编写C扩展可能是最佳选择。

编写C扩展涉及到一些C语言的编程知识,以及对Python/C API的理解。下面是一个简单的C扩展模块的例子:

// example_module.c#include <Python.h>static PyObject* add(PyObject* self, PyObject* args) {int a, b;if (!PyArg_ParseTuple(args, "ii", &a, &b)) {return NULL;}return Py_BuildValue("i", a + b);
}static PyMethodDef ExampleMethods[] = {{"add", add, METH_VARARGS, "Add two integers."},{NULL, NULL, 0, NULL}
};static struct PyModuleDef examplemodule = {PyModuleDef_HEAD_INIT,"example_module",NULL,-1,ExampleMethods
};PyMODINIT_FUNC PyInit_example_module(void) {return PyModule_Create(&examplemodule);
}

这段代码定义了一个简单的C扩展模块example_module,它提供了一个add函数,用于计算两个整数的和。

通过使用Cython、ctypes或编写C扩展,你可以显著提升Python程序的性能,就像是一个运动员穿上了一双超级跑鞋,让他能够更快地跨越障碍,达到终点。接下来,我们将探索如何使用性能分析与调试工具来进一步优化你的程序。

7. 性能分析与调试工具

7.1 cProfile与profiling基础

想象一下,你是一位侦探,正在寻找程序中的“性能犯罪现场”。在这种情况下,cProfile就是你的放大镜和笔记本,帮你记录和分析程序的一举一动。

性能剖析过程与报告解读

使用cProfile,你可以对Python程序进行性能剖析,它会告诉你哪些函数调用最频繁,哪些函数执行时间最长。这就像是侦探在现场收集证据,然后分析线索,找出“犯罪动机”。

举个例子,如果你想剖析一个简单的Python程序,可以这样做:

import cProfiledef some_function():# 这里是一些耗时的操作passdef another_function():for _ in range(1000000):some_function()cProfile.run('another_function()')

运行这段代码后,cProfile会生成一个性能报告,详细列出每个函数的调用次数、总执行时间等信息。

7.2 使用vmprof与gprof进行更深入分析

如果你觉得cProfile还不够深入,或者你需要更详细的内存使用情况,那么vmprofgprof可能是你需要的工具。

多维度性能监控与优化建议

vmprof是一个Python性能分析工具,它提供了一个可视化的界面,帮助你监控内存使用情况和CPU使用情况。使用vmprof,你可以像看实时监控摄像头一样,观察程序的运行状态。

举个例子,使用vmprof可以这样:

# 在命令行中运行
vmprof --callgrind your_script.py

运行后,vmprof会生成一个火焰图(Flame Graph),它以一种非常直观的方式展示了程序的性能瓶颈。

gprof是一个更底层的性能分析工具,通常用于C/C++程序,但也可以通过C扩展用于Python程序。gprof可以提供非常详细的性能数据,包括函数调用的频率、时间等。

举个例子,如果你有一个C扩展模块,并且你想使用gprof进行性能分析,可以这样做:

// 在C扩展模块中添加
void init_your_module() {// 初始化代码// ...if (PyErr_Occurred()) {Py_FatalError("初期化失败");}
}

编译并运行你的程序后,使用gprof命令行工具来生成性能报告。

通过使用这些性能分析与调试工具,你可以像侦探一样,揭开程序性能问题的神秘面纱,找到优化的方向。这样,你的程序就可以像一辆经过精心调校的跑车,以最高效率在路上飞驰。接下来,我们将总结这些策略,并思考如何在实际项目中持续优化性能。

8. 结论

综合策略在实际项目中的应用

想象一下,你是一个武林高手,手握着我们之前提到的各种性能优化秘籍——从精妙的数据结构选择到高效的算法,从并发编程到内存管理,再到C扩展的神兵利器。现在,是时候将这些秘籍应用到江湖(实际项目)中去了。

案例分享

假设你正在开发一个数据分析平台,需要处理大量的数据。你首先使用numpypandas来高效地处理数据,然后通过cProfile找到了性能瓶颈——一个在循环中反复执行的数据处理函数。你决定使用Cython重写这个函数,让它运行得更快。

# 使用Cython重写的函数
cpdef compute_heavy_task(data):# 这里是一些复杂的计算cdef int ifor i in range(len(data)):# 执行一些计算return result

通过这种方式,你不仅提升了性能,还保持了代码的可读性和可维护性。

持续性能优化的思考

性能优化不是一蹴而就的,它更像是一场马拉松,需要持续的努力和思考。在这个过程中,你需要不断地回顾和评估你的策略:

  • 性能测试:定期对你的程序进行性能测试,确保新的更改没有引入性能问题。
  • 代码审查:通过代码审查来发现潜在的性能问题,并分享性能优化的最佳实践。
  • 技术跟进:随着Python和相关库的不断更新,新的性能优化特性和工具也会不断出现,保持学习是非常重要的。

最后,记住性能优化的终极目标是提升用户体验。就像一位大厨,不仅要追求菜品的色香味俱全,更要让食客吃得开心、吃得满意。

通过这些策略,你的程序将不仅仅是运行得快,而是能够以优雅、高效的方式解决实际问题,就像一位武林高手,不仅武艺高强,更懂得如何在江湖中立足。
在这里插入图片描述
阿佑给大家回顾下今天的知识点:

在当今这个信息爆炸、速度至上的时代,Python作为一门优雅而强大的编程语言,已经成为众多开发者的得力助手。然而,你是否曾在编写Python程序时,因为其运行速度而感到焦虑?别担心,本文将带你进入一个全新的性能优化世界,让你的Python程序从龟速飞跃至光速!

首先,我们深入探讨Python的性能瓶颈,从全局解释器锁(GIL)的束缚到内存管理的技巧,每一个环节都是提升性能的关键。我们像侦探一样,使用cProfile等工具,追踪程序的每一个细微动作,找出那些隐藏的性能杀手。

接下来,我们探索如何通过代码层面的优化,让Python程序焕发新生。从数据结构的选择到算法的优化,再到并发与并行处理的技巧,每一步都是提升效率的秘诀。想象一下,通过使用numpypandas这样的高性能库,你的数据处理速度将得到质的飞跃!

而当Python自身的能力已经无法满足你的需求时,Cython和C/C++扩展将是你突破性能极限的终极武器。通过将关键代码转化为C语言,你将能够释放Python的潜力,让程序运行速度得到前所未有的提升。

最后,我们学习了如何使用vmprofgprof等高级工具,进行更深入的性能分析和调试。这不仅仅是对代码的优化,更是对编程思维的一次革命。通过这些工具,你将能够洞察程序的每一个角落,将性能优化做到极致。

在这场性能优化的旅程中,我们将不再是一个普通的程序员,而是一个精通性能优化的大师。我们的程序将不再是简单的代码堆砌,而是一个个精心打磨的艺术品。让我们一起打破Python的性能瓶颈,创造出令人震撼的高效程序,让代码的运行速度快到让人难以置信!

我是阿佑,一个专注于把晦涩的技术讲得有趣的中二青年,欢迎评论区留言~


9. 参考文献

  1. Python官方文档: Performance Tips

    • 官方文档总是我们最好的起点,Python的官方文档中包含了许多关于性能优化的宝贵建议和技巧。
  2. 《High Performance Python》书籍推荐

    • 这本书由作者Michele Simionato撰写,深入探讨了Python性能优化的各个方面,是每一位希望提升Python程序性能的开发者的必读书籍。
  3. Cython官方文档

    • 如果你考虑使用Cython来提升性能,那么官方文档将是你的好帮手,它详细介绍了如何使用Cython以及相关的高级特性。
  4. NumPy官方文档

    • 对于任何需要进行数值计算的Python开发者来说,NumPy都是一个不可或缺的库,其官方文档提供了大量的使用示例和性能优化建议。
  5. Pandas官方文档

    • Pandas是数据分析的瑞士军刀,其官方文档详尽地介绍了如何高效地使用Pandas进行数据处理。
  6. Asyncio官方文档

    • 对于需要处理并发和异步I/O的开发者,Asyncio的官方文档提供了全面的指南和最佳实践。
  7. ctypes和C扩展编程

    • Python的扩展编程文档详细介绍了如何使用ctypes和编写C扩展来增强Python程序的性能。
  8. 性能分析工具文档

    • 包括cProfilevmprofgprof在内的性能分析工具都有自己的文档,这些文档是理解和使用这些工具的关键。
  9. 在线教程和案例研究

    • 网络上有大量的在线教程和案例研究,它们提供了实际的性能优化案例,是学习和启发的好资源。
  10. Stack Overflow和社区论坛

    • Stack Overflow和其他社区论坛是解决具体性能问题的宝库,你可以在这里找到许多经验丰富的开发者分享的解决方案和经验。

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

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

相关文章

区块链系统开发测试----链码部署开发、系统开发验证

一.检查配置环境 检查虚拟机环境&#xff0c;确保有正在运行的Hyperledger Fabric区块链&#xff0c;并且其中chaincode_basic、credit_chaincode链码可以正常调用 查看chaincode_basic、credit_chaincode链码调用 二.开发征信链码代码 基于现有征信链码&#xff0c;开发征信…

Niantic利用Meta Llama让数字生物栩栩如生

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

华为机考入门python3--(26)牛客26-字符串排序

分类&#xff1a;字符串 知识点&#xff1a; 字符串是否仅由字母构成 my_str.isalpha() 字母列表按小写排序 letters.sort(keylambda x: x.lower()) 题目来自【牛客】 def custom_sort(input_str):letters []non_letters []for char in input_str:if char.isalpha…

【软件工程】【23.04】p1

关键字&#xff1a; 软件模型、提炼、加工表达工具、通信内聚、访问依赖、边界类交互分析、RUP核心工作流、首先测试数据流、软件验证过程、CMMI过程域分类工程类&#xff1b; 软件工程目的、功能需求是需求的主体、结构化方法、耦合、详细设计工具、类、类图、RUP采用用例技…

鲜花门店小程序开发流程:详细教程,让你轻松掌握

想要开发一款专属于自己鲜花门店的小程序吗&#xff1f;不知道从何开始&#xff1f;别担心&#xff0c;本文将为你提供详细的开发流程&#xff0c;帮助你轻松掌握。 1. 注册登录乔拓云网并进入操作后台 首先&#xff0c;你需要注册并登录乔拓云网&#xff0c;然后进入操作后台…

Llama模型家族之使用 Supervised Fine-Tuning(SFT)微调预训练Llama 3 语言模型(三)通过web页面方式微调

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

Amazon云计算AWS(一)

目录 一、基础存储架构Dynamo&#xff08;一&#xff09;Dynamo概况&#xff08;二&#xff09;Dynamo架构的主要技术 二、弹性计算云EC2&#xff08;一&#xff09;EC2的基本架构&#xff08;二&#xff09;EC2的关键技术&#xff08;三&#xff09;EC2的安全及容错机制 提供的…

Python自动化办公Excel数据处理实战指南

目录 一、引言 二、需求分析 三、技术选型 四、实战操作 数据读取 数据清洗 数据分析 数据输出 五、学习资源推荐&#xff1a; 六、结语 一、引言 在现代办公环境中&#xff0c;Excel数据处理是一项不可或缺的技能。然而&#xff0c;当数据量庞大、处理流程复杂时&a…

Linux文本文件管理003

★排序、去重、统计★ 1&#xff09;排序 sort -n按照数值排序 -r降序排列 2&#xff09;去重 uniq 过滤相邻、重复的行 -c 对重复行计数 3&#xff09;统计 wc 统计文件中的字节数、单词数、行数 -l 显示行数 今天通过使用grep、awk、cut指令和上面几个选项提取文本文件…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(八)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 继续接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 现在&#xff0c;我们…

三十、openlayers官网示例解析Double click, Drag and Zoom——第二次点击鼠标拖拽缩放地图效果、取消地图双击放大事件

这篇展示了如何在地图上添加第二次按下鼠标移动鼠标实现拖拽缩放地图效果。 官网demo地址&#xff1a; Double click, Drag and Zoom 官网介绍文字的翻译如下&#xff1a; 示例比较简单&#xff0c;直接贴代码&#xff1a; const map new Map({//添加第二次点击拖拽缩放地图i…

一文了解等保2.0中IPS与IDS的差异

IPS&#xff08;入侵防御系统&#xff09; 入侵防御系统是一部能够监视网络或网络设备的网络资料传输行为的计算机网络安全设备&#xff0c;能够即时的中断、调整或隔离一些不正常或是具有伤害性的网络资料传输行为。 对异常的、可能是入侵行为的数据进行检测和报警&#xff…

MM模块六(收货)

接到供应商收到的货以后&#xff0c;进行一个收货的动作 收货&#xff1a;MIGO 1.消耗物料的采购订单 数量是供应商的数量 消耗物料的采购订单&#xff0c;收进来的货物直接进入消耗&#xff0c;不会增加库存&#xff0c;所以这里没有库存地点进行选择 点击过账 收货后在采购…

微服务架构五大设计模式详解,助你领跑行业

微服务架构设计模式详解(5种主流模式) 微服务架构 微服务&#xff0c;一种革命性的架构模式&#xff0c;主张将大型应用分解为若干小服务&#xff0c;通过轻量级通信机制互联。每个服务专注特定业务&#xff0c;具备独立部署能力&#xff0c;轻松融入生产环境&#xff0c;为系…

2005-2022年各省全体居民人均可支配收入数据(无缺失)

2005-2022年各省全体居民人均可支配收入数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;2005-2022年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;全体居民人均可支配收入 4、范围&#xff1a;31省 5、缺失情况&#xff1a;无缺失 6、指标解释…

java多线程创建方式

1. 继承Thread类 这种方式是通过创建一个新的类继承自Thread类&#xff0c;并覆盖run()方法来创建线程。然后通过创建这个类的对象并调用其start()方法来启动线程。 public class MyThread extends Thread { public void run() { // 在这里定义线程的执行逻辑 …

Java—选择排序

选择排序是一种简单但高效的排序算法。它的基本思想是从未排序的部分中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;并将其放置在已排序部分的末尾。 实现步骤 具体实现选择排序的步骤如下&#xff1a; 遍历数组&#xff1a;从数组的第一个元素开始&#xff0…

webpack构建流程

对webpack的理解&#xff1a; webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具 可以使用webpack管理模块 因为在webpack看来&#xff0c;项目中的所有资源皆为模块&#xff0c;通过分析模块间的依赖关系&#xff0c;在其内部构建出一个依赖图&#xff0c;最终编…

【MATLAB】数字滤波器的设计

一、引言 在信号处理过程中&#xff0c;所处理的信号往往混有噪声&#xff0c;从接收到的信号中消除或减弱噪声是信号传输和处理中十分重要的问题。根据有用信号和噪声的不同特性&#xff0c;提取有用信号的过程称为滤波,实现滤波功能的系统称为滤波器。在以往的模拟电路中用的…

OrangePi AIpro测评:智能与创新的完美结合

OrangePi AIpro上手指南 简介 香橙派与华为合作发布的香橙派AiPro为Ai主力&#xff0c;为边缘设备的Ai计算提供了可能。 集成图形处理器&#xff0c;拥有8GB/16GB LPDDR4X&#xff08;我这个是8G内存版本的&#xff09;&#xff0c;可以外接32GB/64GB/128GB/256GB eMMC模块&a…