- 博客(255)
- 收藏
- 关注
原创 高级优化技巧 - 并行算法优化
并行算法优化是提高程序性能的另一个重要领域。通过设计高效的并行算法,可以更好地利用多核处理器的计算资源,显著加速计算过程。
2024-11-28 22:16:36
392
原创 高级优化技巧- 数据结构优化
然而,哈希表的性能会受到哈希冲突的影响,因此,选择合适的哈希函数和调整负载因子是优化哈希表性能的关键。设计数据结构时,确保数据成员按合适的对齐方式存储,能够减少访问内存时的开销。现代 CPU 通常对数据的对齐有一定要求,适当的内存对齐可以提高缓存命中率,减少内存访问延迟。通过预先分配一块内存区域并从中管理内存块,内存池可以减少频繁的内存分配和释放操作,避免内存碎片。在多线程环境下,使用并发数据结构(如并发队列、并发哈希表)可以避免线程间的竞争,减少同步的开销,提升程序的并发性能。
2024-11-28 22:15:28
276
原创 性能瓶颈的定位
如果程序的性能受限于 CPU 执行指令的速度,那么它通常是 CPU 密集型的瓶颈。常见的 CPU 密集型瓶颈包括算法效率差、循环过多、函数调用过于频繁等。如果程序的性能受限于磁盘 I/O 或网络 I/O,那么它通常是 I/O 密集型的瓶颈。如果程序的性能受限于内存的访问速度或内存容量,那么它通常是内存瓶颈。如果程序的性能受限于线程管理和并发执行的效率,那么它通常是线程瓶颈。常见的线程瓶颈包括线程锁争用、线程调度不均、内存访问竞争等。分析程序的性能时,通常会面临大量的数据和不同类型的瓶颈。
2024-11-28 22:13:16
366
原创 最常用的三种锁
原子操作是不可分割的操作,在多线程环境中可以避免锁的使用,提高性能。原子操作通常用于简单的数据修改,如计数器的增加。多线程编程中,多个线程往往需要访问共享数据。为了保证数据一致性,线程间的同步至关重要。互斥锁用于确保同一时间只有一个线程访问共享数据。使用互斥锁可以避免数据竞争,但锁的使用会引入额外的开销。读写锁允许多个线程并行读取数据,但在写操作时,必须独占访问权限。读写锁适用于读取操作远多于写操作的场景。
2024-11-28 21:59:29
151
原创 内存优化的分类
内存访问优化是提高程序性能的一个核心部分。在现代计算机系统中,内存访问通常比 CPU 运算慢得多,特别是在涉及到主内存的访问时。因此,优化内存访问模式,减少内存延迟,是实现高效程序的关键。
2024-11-28 21:57:33
308
原创 内存访问优化
在频繁访问的内存区域,减少页表查找的次数可以提高性能。优化数据结构,避免不必要的内存分配和释放,有助于减少页面交换和分页延迟。确保数据结构在内存中按照适当的边界对齐,可以提高 CPU 缓存的访问效率。内存对齐避免了不必要的访问延迟和缓存未命中。优化内存访问是提高程序性能的一个重要方面。提高内存访问的空间局部性和时间局部性,可以显著减少缓存未命中的次数。例如,使用顺序存储访问数据,避免随机访问。
2024-11-28 21:55:06
136
原创 Cache miss和常见的优化手段
是指当 CPU 试图访问某个数据时,发现该数据不在缓存中,需要从更慢的内存层次(如 L2、L3 或主内存)加载该数据。程序应该尽可能地以顺序的方式访问数据,利用空间局部性(访问相邻内存位置的数据)和时间局部性(重复访问相同数据)。例如,遍历数组时,按顺序访问元素,而不是跳跃访问。通过分析程序的访问模式,CPU 可以预测接下来要访问的数据并提前加载到缓存,减少等待时间。如果程序中存在不常用的数据访问模式,可能会“污染”缓存,导致频繁的缓存未命中。优化数据访问顺序,避免让频繁访问的数据被不常用的数据覆盖。
2024-11-28 21:54:05
1360
原创 指令级并行(ILP)
指令重排序技术使得 CPU 能够在遇到数据依赖性时,跳过一些指令,先执行其他不依赖于前一指令的操作。这样,即使某些指令由于数据依赖需要等待,它们也可以在不阻塞其他指令的情况下继续执行,从而提高并行度。投机执行技术使得 CPU 能够在无法确定某些指令的执行顺序时,先行执行某些可能的指令。例如,在遇到分支指令时,CPU 会预测分支的结果并执行预测路径上的指令,如果预测错误,则撤销这些指令的执行。例如,Intel 的现代处理器通常是超标量的,它们可以同时执行多条整数运算和浮点运算,从而提高指令的吞吐量。
2024-11-28 21:51:53
261
原创 性能回归的4大原因
生产环境中的配置更改(如服务器内存、硬盘 I/O 性能等)可能会影响性能。例如,改变了数据库的缓存大小或系统的网络带宽配置,可能导致性能问题。例如硬件升级或操作系统版本更新后,可能会影响程序的执行性能。不同的硬件配置、操作系统版本或甚至虚拟化层都可能导致性能差异。应用程序的外部依赖(如数据库、网络库等)更新后,可能会导致性能回归,尤其是在没有进行充分性能测试的情况下。新功能的加入或现有代码的修改可能会不小心引入性能瓶颈。例如,修改算法或更换库的实现可能导致性能下降。
2024-11-28 21:50:31
166
原创 主动基准测试与被动基准测试的对比
特性被动基准测试主动基准测试数据收集方式测试后收集数据实时收集数据,动态分析控制粒度只能在测试结束时获取整体数据可以在运行过程中精确控制和调整性能开销较低,但可能错过一些细节较高,实时监控会增加额外开销适用场景适用于对程序整体性能有概括性要求的测试适用于需要深入分析程序执行过程中的特定瓶颈时
2024-11-28 21:49:55
99
原创 软件计时器和硬件计时器在性能测试中的应用
软件计时器通常由操作系统提供,用于测量程序运行时间。硬件计时器由处理器提供,通常具有更高的精度和更低的开销。
2024-11-28 21:48:23
351
原创 手动性能测试的基本步骤
尽管自动化性能测试在现代开发流程中非常重要,手动性能测试仍然是性能工程中不可或缺的一部分。手动测试能够提供灵活性,并允许开发者深入研究特定的性能问题。在测试之前,明确希望回答的问题。例如:“为什么这个函数运行得很慢?”、“是否有未优化的算法导致性能瓶颈?”或者“特定配置对性能的影响是什么?根据收集到的数据分析性能瓶颈。例如,通过查看函数调用图,确定高频调用的函数是否可以优化。性能测试通常需要多次运行,以减少测量噪声。记录每次测试的结果,并计算平均值或中位数。
2024-11-28 21:47:10
316
原创 对两个 4096 x 4096 矩阵相乘程序进行性能优化的速度提升
Leiserson 等人,2020] 的论文为性能差距提供了一个优秀的例子,该例子展示了“默认”与高度优化软件之间的对比。
2024-11-28 21:30:26
162
原创 GDB 与 C++ 模板和泛型编程调试
通过 GDB,你可以深入了解模板的实例化过程,查看每个模板函数和类的具体类型,以及在不同类型的情况下调试模板代码。模板编程就像解锁一个复杂的魔方,每次旋转都可能带来新的挑战,但随着经验的积累,你可以轻松解开每一个难题。调试模板和泛型代码就像是在读一本语言古老、结构复杂的书:你需要通过不同的“翻译工具”(如 GDB),来帮助你理解每一行的意义。通过 GDB,你可以跟踪模板实例化的过程,查看模板参数的值,并逐步调试复杂的模板逻辑。通过查看变量的类型和模板的实例化过程,你可以更容易地发现类型不匹配的问题。
2024-11-26 12:47:15
567
原创 GDB 与性能分析:分析和优化代码的性能瓶颈
程序的性能是开发者关注的重要方面,尤其是在处理大量数据或运行复杂计算的应用中。通过分析 CPU 性能、内存使用和函数执行时间,你可以在程序的关键部分进行有针对性的优化,提升整体性能。性能调试就像是在寻找一个迷失在大海中的宝藏:需要通过细致的分析和精准的工具,才能找到隐藏的瓶颈并加以优化。在这样的环境下,GDB 提供的功能可以帮助开发者深入分析程序的运行状态,识别出哪些部分最耗费资源,从而进行针对性的优化。” 在性能调试中,创新的思维和精准的工具将帮助你跨越性能瓶颈,实现更高效的程序。
2024-11-26 12:46:41
848
原创 GDB 与调试 C++ 多线程程序
调试 C++ 多线程程序比调试单线程程序复杂,因为你需要考虑线程的创建、同步、上下文切换和资源竞争。多线程调试就像调试一个复杂的交响乐团:每个乐器(线程)都在奏响自己的旋律,但它们需要协调一致才能创造出美妙的乐章。多线程调试就像在一个充满多个工人的工厂里找出生产瓶颈:每个工人(线程)都有自己的任务,但有时它们的工作会互相干扰,导致生产线停滞。调试多线程程序时,GDB 提供了强大的功能来管理线程、查看线程堆栈、监控共享资源和锁的状态。多线程程序中的每个线程都有自己的堆栈和执行路径。找出哪些线程正在等待锁。
2024-11-24 11:43:23
634
原创 GDB 与调试高性能计算程序
通过 GDB 的多进程调试功能和性能分析技巧,你可以轻松优化并行计算程序的效率,解决运行中的各种问题。高性能计算的调试就像精密仪器的调试:每一个细小的缺陷都可能影响整体的性能。在高性能计算中,调试不仅仅是为了找到错误,更多的是为了提升程序的效率和稳定性。GDB 提供了强大的功能,可以帮助开发者深入分析并行计算中的问题,监控性能瓶颈并解决难以捉摸的内存错误。调试 HPC 程序就像在高压环境中调试一台复杂的发动机:你必须密切观察每个部件的运作,迅速识别潜在的故障,并采取行动。,揭示多线程调试的复杂性与技巧。
2024-11-24 11:42:47
755
原创 GDB 与网络调试:调试网络协议与通信程序
GDB 与网络调试工具(如 Wireshark 和 Netcat)的结合,让网络程序的调试变得更加高效和精准。网络调试就像调试一条复杂的通信链路:每一端的行为都可能影响整个过程。” 在网络调试中,抓住每一个细节,才能确保程序如预期般稳定运行。调试网络问题时,我们不仅需要查看代码,还需要理解底层网络通信的过程。GDB 可以用来调试网络应用,跟踪发送和接收的网络数据,帮助开发者深入理解网络协议的实现。调试网络协议就像修理一辆复杂的机器车:数据在不同的组件间流动,而调试者需要找到流动的瓶颈或故障点。
2024-11-24 11:41:58
967
原创 GDB 调试 Linux 内核模块
与用户空间程序不同,内核模块直接操作硬件并管理系统资源,因此调试内核代码时,我们需要使用特定的工具和方法。然而,使用 GDB 调试内核模块,可以让我们深入了解内核的运行机制,查找和修复硬件驱动、内存管理等底层问题。掌握内核调试技术,不仅能提升你的系统级编程技能,还能让你在开发高性能、稳定的系统时游刃有余。调试内核就像修复一台复杂的机器:它是一个由无数细小部件组成的庞大系统,任何一处小问题都有可能导致系统的整体故障。KDB 是 Linux 内核的交互式调试器,允许你在内核崩溃时调试内核。
2024-11-24 11:41:21
644
原创 GDB 与调试信息格式(DWARF)的深度解析
DWARF 是现代调试工具的基础,它通过精确描述源代码与机器代码的映射,为调试工具提供了分析和操作的可能。DWARF 是调试工具的基石,它提供了从源代码到机器代码的映射,使调试变得高效而精准。通过理解 DWARF 的结构和信息,我们可以更深刻地掌握调试工具的工作原理,从而更好地解决复杂程序中的问题。DWARF 的信息通常嵌入在程序的可执行文件或符号文件(如 ELF 格式)中,供调试器(如 GDB)使用。了解 DWARF,如同掌握了一本程序调试的“词典”,让你能更深入理解调试工具的工作原理。
2024-11-24 11:40:45
1233
原创 GDB 调试 C++ 的虚函数与多态
调试 C++ 的虚函数与多态行为需要理解 vtable 的底层实现,以及 GDB 提供的工具如何帮助我们解析这些动态行为。通过跟踪 vtable 的内容、检查动态类型信息,你可以清晰掌握虚函数的调用流程。调试虚函数就像解剖一架飞行中的飞机——既要看到每个组件的运转,又要了解它们如何协作完成复杂任务。C++ 的多态性通过虚函数实现,虚函数表(vtable)在运行时动态分派函数调用。调试虚函数和多态性,就像透过迷雾看远山:看似模糊,但通过正确的方法,你可以清晰掌握背后的逻辑。,揭示调试符号背后的原理。
2024-11-24 11:40:14
718
原创 GDB 的条件断点与监视点高级用法
条件断点和监视点正是你的“瞄准器”,帮助你在复杂代码中找到问题的真相。条件断点和监视点是调试复杂程序的利器,它们能精准控制调试触发点,极大地提升调试效率。这时候,GDB 的条件断点和监视点功能就像精确制导武器,可以让调试过程更加高效。它们可以精准控制调试点的触发条件,帮助你快速找到问题的根源。假设你需要找到某个断点触发前变量的状态,可以结合断点与监视点一起使用。运行程序,程序会在断点触发后暂停,同时监控变量变化。你可以为监视点添加条件,避免不必要的暂停。的值发生变化时,程序会自动暂停。
2024-11-24 11:39:23
838
原创 通过 GDB 分析多进程程序
多进程调试就像指挥一支交响乐队——每个进程都是独立的乐器,而调试者需要确保它们按计划演奏。正如黑格尔所说:“真理是整体的。GDB 提供了对多进程程序的全面支持,包括跟踪子进程、切换调试上下文以及监控进程间的通信。调试多进程程序,如同在一座大厦中寻找故障点——需要快速定位、上下联动,才能彻底排查问题。调试多进程程序需要理解进程的生命周期以及它们之间的交互。GDB 提供了强大的工具来跟踪、切换和调试多个进程,帮助你快速发现问题。多进程程序在现代软件中非常常见,例如服务器应用和并行计算。下一篇博客将深入探讨。
2024-11-24 11:38:42
497
原创 使用 GDB 调试优化后的编译程序
优化后的代码调试就像修复一架复杂的机械钟表——所有零件都被重新设计以追求精度,但它们的精密也带来了维护的难度。” 掌握调试优化程序的技巧,才能从细节中找到真相。优化编译的强大之处在于提高程序运行效率,但它对调试带来的挑战也不容忽视。通过正确理解优化对代码的影响,并结合 GDB 的强大功能,我们可以在性能与可调试性之间找到平衡。调试优化后的程序,就像解读一本被删减重编的书——你需要从断章残句中拼凑原本的故事。GDB 提供了多种方法,帮助你在优化的迷宫中找到调试的出口。在优化后,代码可能已被编译为复杂的指令。
2024-11-24 11:38:09
643
原创 在 GDB 中调试内存问题:内存泄漏与非法访问
它们不会立刻让程序崩溃,却可能随着时间的推移吞噬你的系统资源,甚至导致灾难性的后果。传统调试方法难以捕获这些问题,而 GDB 提供了强大的工具来定位内存异常。内存问题调试就像修理一条暗藏破洞的管道:你需要追踪每一滴水的流向,找到隐藏的问题点,并及时修补。正如尼采所言:“凡是不能毁灭你的,终将使你更强大。” 对程序来说,解决内存问题就是迈向稳定与高效的关键一步。GDB 和 Valgrind 的结合,让内存调试过程变得更加高效和直观。通过检查内存分配与释放、捕获越界访问和泄漏问题,你可以大幅提升程序的稳定性。
2024-11-24 11:37:30
1344
原创 GDB 与远程调试:调试嵌入式系统
远程调试就像远程操控机器人——你并不直接触碰目标设备,但通过工具与技术的结合,你能够像现场操作一样精准高效。随着物联网和嵌入式设备的普及,开发者常需要调试运行在硬件限制较大的嵌入式系统中的代码。而通过远程调试,你可以使用主机上的 GDB 调试目标设备上的程序。远程调试将主机的强大调试能力与目标设备的程序运行环境结合,赋予开发者在嵌入式系统中追踪和解决问题的能力。远程调试如同远程手术——即使病人(目标设备)在远处,你依然可以通过精密的工具(GDB)对它进行细致操作,定位问题,甚至修复它。
2024-11-24 11:36:57
779
原创 GDB 脚本化:使用 Python 自动化调试
这时,GDB 的脚本化能力就像一个超能力工具,能够将复杂的调试过程自动化。通过 GDB 的 Python API,你可以将繁琐的调试工作自动化,让调试过程更加高效。调试过程的自动化,正如工业革命中的流水线生产,让工作变得更高效、更精准。而作为调试者,理解并掌控调试工具的每个细节,就如同掌握了自动化生产的按钮,提升了问题解决的艺术。通过 Python 脚本,你可以批量分析程序状态、自动生成调试日志,甚至动态修改程序运行行为。调试不再是痛苦的重复劳动,而是有趣的“自动驾驶”!,带你玩转跨设备的调试技术。
2024-11-24 11:36:20
1599
原创 使用 GDB 调试汇编代码
汇编代码则是直接与 CPU 对话的语言,能帮助我们了解程序的精确运行方式。调试汇编代码不仅能帮助你优化性能,还能追踪复杂问题,如硬件异常、编译器生成的错误指令等。汇编调试就像解剖人体,你了解的不仅是外部行为,还深入到最微观的运作机制。调试汇编代码如同探秘地球深处——你会发现隐藏的运行机制,并获得优化和修复的强大能力。GDB,作为一把精密的地质探测仪,将带你深入这片未知领域。调试汇编代码让你进入程序的核心运行世界,直接接触 CPU 指令、寄存器和内存的细节。GDB 会显示指令的具体地址和对应的操作。
2024-11-24 11:35:32
1033
原创 通过 GDB 分析程序崩溃(核心转储文件)
这时候,你需要核心转储文件(Core Dump)和 GDB 的强大工具来帮助你找到问题的根源。GDB 提供的工具,帮助你逐层还原问题的真相,正如侦探追查案情,每一个细节都至关重要。核心转储文件是程序“生命”结束后的遗书,调试者通过它解读程序的故事。调试的过程不仅仅是修复问题的工具,更是了解程序内部世界的窗口,教会我们如何更好地设计和构建稳定的系统。调试核心转储文件,就像侦探调查一场意外的案发现场——你有一具“程序遗体”(转储文件),需要通过蛛丝马迹找到导致程序死亡的真正原因。,解锁调试低层代码的技巧。
2024-11-24 11:34:44
825
原创 动态库与 GDB:如何调试共享库(.so 文件)
然而,调试动态库往往复杂,因为它们在运行时动态加载,函数符号可能未绑定,甚至部分库可能被延迟加载。动态库的调试就像乐队排练:主程序是指挥,动态库是乐器。调试动态库不仅仅是找到符号和设置断点的过程,更是深入理解程序运行时动态链接的一个机会。调试动态库,就像解开复杂的拼图——你需要找到正确的碎片,理清它们的连接关系。为了模拟调试动态库的场景,我们创建一个简单的共享库和一个调用它的主程序。动态库的符号在运行时加载,因此调试时需要检查符号是否正确加载。在现代软件开发中,动态库(共享库。,解决程序崩溃后的问题排查。
2024-11-24 11:33:44
1342
原创 使用 GDB 调试多线程程序的最佳实践
在多线程调试中,每个线程都像一条轨道上的列车,而调试者就像一名列车调度员,需要同时监控每辆列车的位置、速度,避免它们互相碰撞。比如,线程之间的竞争条件(Race Condition)、死锁(Deadlock),以及线程局部变量的调试都让开发者头疼。调试多线程程序时,我们需要的不仅是细致的观察力,还需要像 GDB 这样的“显微镜”级工具,帮助我们洞察每个线程的运行状态、切换线程、观察线程间共享变量的变化。GDB 的线程支持让我们可以深入观察每个线程的状态,从而更高效地分析问题,例如竞争条件和死锁。
2024-11-24 11:33:11
998
原创 gdb断点设置的全面教程
GDB 的中断点(Breakpoint)是你的“暂停按钮”,可以让你随时打断程序运行,检查局部变量、执行路径,甚至重走部分逻辑,找到问题的根源。无论是条件断点还是命令断点,每种断点都有独特的用途。学习调试技巧,像极了拆解一个复杂的机械装置:你先从零件入手,逐步了解它的结构与原理;本篇博客将带你玩转 GDB 中的各种断点,从基本的行断点到条件断点、命令断点,甚至动态断点。除了断点,GDB 还提供了监视点(Watchpoint),用来监控变量的变化。条件断点让你指定触发断点的条件。行断点让程序在指定行号暂停。
2024-11-24 11:32:14
1206
原创 初学者的 GDB 入门实战 系列博客
你需要借助像 GDB 这样的工具,逐步揭开每一层谜团。初学 GDB 可能会有些枯燥,但一旦掌握了这些技巧,你会发现它赋予了你对代码的“透视眼”,从而能在错误中找到解决问题的钥匙。你是否有过这样的时刻:写了一堆代码,却不知道程序哪里出错了?如果是,那你需要 GDB——调试界的显微镜!”编程亦是如此,调试工具让复杂的问题变得简单,而掌握工具本身则是迈向卓越的第一步。断点就像程序的“交通信号灯”,告诉 GDB 在特定位置停下来,让我们检查程序的状态。你的第一个 GDB 调试会话成功运行了。
2024-11-24 11:31:43
746
原创 第九部分:Python 的生态与学习路径
Python 拥有极其丰富的生态系统和友好的学习曲线,从初学者到高级开发者,都能在 Python 社区找到适合的工具和资源。通过本教程,你已经掌握了 Python 的基础语法、数据处理、并发编程,以及实际项目的开发能力。Python 拥有丰富的生态系统和庞大的开发者社区,涵盖数据分析、机器学习、Web 开发、自动化脚本等领域。本部分将总结 Python 的工具链、常用库、学习资源,并推荐开源项目,帮助你进一步拓展技能。是 Python 的代码检查工具,用于发现潜在错误和风格问题。
2024-11-24 11:25:15
925
原创 第八部分:Python 的性能优化与进阶技术
本部分将深入探讨 Python 的性能优化方法和进阶技术,包括内存管理、测试与调试、并讲解如何编写高效的代码。通过这些内容,你将能够提升 Python 程序的性能,同时提高代码的可维护性。下一部分将总结整个 Python 教程,并提供学习资源和开源项目推荐,帮助你进一步扩展 Python 技能。Cython 是 Python 的超集,支持将代码编译为 C 提高性能。是 Python 内置的测试框架,用于编写和运行单元测试。是一个功能强大的测试框架,支持更简洁的测试代码。运行后会显示每一行的内存使用情况。
2024-11-24 11:24:43
934
原创 第七部分:Python 项目实战
本部分通过两个实际项目案例展示 Python 的实战能力。第一个项目是开发一个命令行工具,用于统计文件中的单词和行数;第二个项目是构建一个简单的 Web 应用,展示 Python 在 Web 开发中的强大能力。下一部分将重点讲解 Python 的性能优化和进阶技术,包括内存管理、测试与调试,以及编写高效代码的技巧。
2024-11-23 14:46:50
350
原创 第六部分:Python 的并发与异步
Python 提供了多线程、多进程和异步编程的强大支持,适合处理并发任务、IO 密集型任务以及大规模分布式系统。本部分将详细讲解 Python 的并发与异步模型,帮助你高效地处理多任务。异步编程是处理 IO 密集型任务的高效方式,通过非阻塞操作提高程序的吞吐量。下一部分将通过两个实际项目展示 Python 的实战能力,包括构建命令行工具和 Web 应用。模块用于多进程操作,每个进程都有独立的内存空间,适合 CPU 密集型任务。模块提供了线程池,简化了多线程任务的提交与管理。模块允许线程与异步任务结合。
2024-11-23 14:46:19
291
原创 第五部分:Python 的核心库
Python 的核心库和第三方库生态非常丰富,为数据处理、分析、可视化和网络操作提供了强大的支持。本部分将详细讲解数据处理库 NumPy 和 pandas,以及数据可视化库 Matplotlib 和 Seaborn,帮助你掌握常见的 Python 数据处理与分析技术。下一部分将探索 Python 的并发与异步编程,包括多线程、多进程和异步 IO 的实现。Seaborn 是基于 Matplotlib 的高级可视化库,适合统计数据的可视化。NumPy 是用于科学计算的基础库,提供了高效的多维数组(
2024-11-23 14:43:26
637
原创 第四部分:Python 的高级功能
本部分将深入探索 Python 的高级功能,包括装饰器、生成器、文件操作与异常处理,以及模块和包的管理。下一部分将重点讲解 Python 的核心库,包括 NumPy 和 pandas 的数据处理功能,以及 Matplotlib 和 Seaborn 的可视化能力。装饰器是一个函数,用于动态修改另一个函数或类的功能。关键字定义的函数,用于按需生成数据,而不是一次性返回所有数据。模块是一个包含 Python 代码的文件,用于组织代码。是 Python 的包管理工具,用于安装第三方库。子句用于执行清理操作。
2024-11-23 14:42:40
368
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人