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

news2024/11/26 7:02:31

哈喽,我是阿佑,上篇咱们讲了 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 np

data = 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 Pool

def 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 aiohttp

async 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 weakref

class MyClass:
    pass

obj = MyClass()
weak_obj = weakref.ref(obj)

del obj  # 删除对象,引用计数降到0
print(weak_obj())  # 返回None,因为对象已经被回收

调整GC策略提升性能

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

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

import gc

gc.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=3

cpdef double sum_array(double[:] arr):
    cdef int i, n = arr.shape[0]
    cdef double s = 0
    for 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 cdll

lib = 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 cProfile

def some_function():
    # 这里是一些耗时的操作
    pass

def 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 i
    for 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.coloradmin.cn/o/1709058.html

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

相关文章

docker-compose 映射端口失败! docker端口映射失败 ,docker映射只能使用老端口,映射无法使用

1. 现象 使用docker-compose 启动项目&#xff0c;发现映射端口出现问题&#xff0c;不能映射端口&#xff01; 如图&#xff1a; 使用原来端口是可以使用的 2. 问题原因&#xff1a; 使用了docker-mode 为host模式&#xff0c;所以不能换端口&#xff0c;只能写为"8086:…

Java RMI

RMI - 安全篇 RMI分为三个主体部分&#xff1a; *Client-客户端*&#xff1a;客户端调用服务端的方法 *Server-服务端*&#xff1a;远程调用方法对象的提供者&#xff0c;也是代码真正执行的地方&#xff0c;执行结束会返回给客户端一个方法执行的结果。 *Registry-注册中心…

动态内存管理—C语言通讯录

目录 一&#xff0c;动态内存函数的介绍 1.1 malloc和free 1.2 calloc 1.3 realloc 1.4C/C程序的内存开辟 二&#xff0c;通讯录管理系统 动态内存函数的介绍 malloc free calloc realloc 一&#xff0c;动态内存函数的介绍 1.1 malloc和free void* malloc (…

Python 读取.shp文件并生成图幅编号

代码适用于需要处理和分析地理空间数据的场景&#xff0c;如城市规划、环境监测或自然资源管理&#xff0c;其中它可以帮助用户读取特定区域的Shapefile文件&#xff0c;确定其地理边界&#xff0c;并基于这些边界计算出按照经纬度5度间隔的图幅编号&#xff0c;进而用于地图制…

Qt Creator(2)【如何在Qt Creator中创建新工程】

阅读导航 引言一、Qt Creator开始界面介绍二、如何在Qt Creator中创建新工程1. 新建项目2. 选择项目模板3. 选择项目路径4. 选择构建系统5. 填写类信息设置界面6. 选择语言和翻译文件7. 选择Qt套件8. 选择版本控制系统9. 最终效果 三、认识Qt Creator项目内容界面1. 基本界面2.…

数据安全革命:Web3带来的隐私保护创新

随着数字化时代的发展&#xff0c;数据安全和隐私保护问题日益突出。传统的中心化数据存储和管理方式已经无法满足日益增长的数据安全需求&#xff0c;而Web3作为下一代互联网的新兴力量&#xff0c;正以其去中心化、加密安全的特性&#xff0c;引领着一场数据安全革命。本文将…

力扣232. 用栈实现队列(两栈实现队列)

Problem: 232. 用栈实现队列 文章目录 题目描述思路Code 题目描述 思路 利用两个栈&#xff0c;一个入栈一个出栈搭配着实现队列的相关操作&#xff1a; 1.创建两个栈stack1和stack2&#xff1b; 2.void push(int x):将要入队的元素先入栈stack1&#xff1b; 3.int pop()&…

LangChain之链的应用(下)

LangChain之链的应用 Chain链的应用配置LLMChain&#xff1a;简单链create_stuff_documents_chain&#xff1a;文档链create_extraction_chain&#xff1a;提取信息链LLMMathChain&#xff1a;数学链create_sql_query_chain&#xff1a;SQL查询链连接数据库创建并使用链 Sequen…

C语⾔:内存函数

1. memcpy使⽤和模拟实现&#xff08;对内存块的复制&#xff0c;不在乎类型&#xff09; void * memcpy ( void * destination, const void * source, size_t num ); • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 • 这个函数在遇…

检索模型预训练方法:RetroMAE

论文title&#xff1a;https://arxiv.org/pdf/2205.12035RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder 论文链接&#xff1a;https://arxiv.org/pdf/2205.12035 摘要 1.一种新的MAE工作流&#xff0c;编码器和解器输入进行了不同的掩…

代码随想录算法训练营第四十六天||139.单词拆分

一、139.单词拆分 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明&#xff1a; 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1&#xff1a; 输入: s …

[智能AI摄像头]使用docker搭建RV1126开发环境

创建ubuntu docker 创建dockerfile # 设置基础镜像为Ubuntu 18.04FROM ubuntu:20.04# 设置作者信息MAINTAINER warren "2016426377qq.com"# 设置环境变量&#xff0c;用于非交互式安装ENV DEBIAN_FRONTENDnoninteractive# 备份源列表文件RUN cp -a /etc/apt/source…

洗地机哪个牌子清洁效果好?十大公认最好的洗地机品牌

在快节奏的现代生活中&#xff0c;洗地机以其吸尘、拖地和洗地三合一的功能&#xff0c;极大地简化了家庭清洁工作&#xff0c;已成为家庭清洁的得力助手。它不仅能缩短清洁时间&#xff0c;节省体力&#xff0c;还能提升清洁效果。作为资深的居家测评家&#xff0c;关于洗地机…

5W 3KVAC隔离 宽电压输入 AC/DC 电源模块,广泛用于工控和电力仪器、仪表、智能家居等相关行业——TP05AL系列

TP05AL系列产品是一款经济型开板式开关电源&#xff0c;输出功率为5W&#xff0c;具有可靠性高、小体积、性价比高等特点&#xff0c;广泛用于工控和电力仪器、仪表、智能家居等相关行业。 产品特性&#xff1a; 输出&#xff0c;输入特性 &#xff1a;

Python基于PyQt6制作GUI界面——多选框

QCheckBox 是 PyQt6 中的一个复选框控件&#xff0c;它允许用户通过单击来选择或取消选择某个选项。与 QRadioButton 不同&#xff0c;QCheckBox 控件并不互斥&#xff0c;这意味着用户可以同时选择多个 QCheckBox。示例对应的制作的 ui文件 界面如下所示。 <?xml version…

VSCode自动生成代码片段

1. 代码片段配置入口 输入&#xff1a;snipp 选择 Configure User Snippets 然后再选择 New Global Snippets file 输入 新建文件名称&#xff0c;然后按回车键。 2. 编辑代码模板 文件头和函数头模板&#xff1a; {"FileHeader":{"scope": "…

工作纪实50-Idea下载项目乱码

下载了公司的一份项目代码&#xff0c;发现是gbk格式的&#xff0c;但是我的日常习惯又是utf-8&#xff0c;下载项目以后全是乱码&#xff0c;一脸懵 借用网友的一张图&#xff0c;如果是一个一个文件这么搞&#xff0c;真的是费劲&#xff0c;好几百个文件&#xff01; 步骤…

React@16.x(11)ref

目录 1&#xff0c;介绍1.1&#xff0c;得到的结果 2&#xff0c;参数类型2.1&#xff0c;字符串&#xff08;不再推荐&#xff09;2.2&#xff0c;对象2.3&#xff0c;函数函数调用时机 3&#xff0c;注意点 1&#xff0c;介绍 reference 引用。和 vue 中的 refs 类似&#x…

【软考】下篇 第12章 信息系统架构设计理论与实践

目录 一、信息系统架构的定义二、信息系统架构风格三、信息系统架构分类四、信息系统常用的4种架构模型&#xff08;SCSB&#xff09;五、企业信息系统的总体框架ISA六、TOGAF & ADM七、信息化总体架构方法信息化六要素信息化架构模式信息系统生命周期&#xff08;规分设实…

AI绘画Stable Diffusion【ControlNet】:使用InstantID插件实现人物角色一致性

大家好&#xff0c;我是阿威。 今天我们介绍一下InstantID。它能够实现在保持高保真度身份保留的同时&#xff0c;仅使用单张面部图像参考就可以实现个性化图像合成&#xff0c;并且支持各种不同的风格。 今天我们就来看看在Stable Diffusion的ControlNet插件中InstantID模型…