当前位置: 首页 > news >正文

Python程序15个提速优化方法

目录

  • Python程序15个提速优化方法
    • 1. 引言
    • 2. 方法一:使用内建函数
      • 代码示例:
      • 解释:
    • 3. 方法二:避免使用全局变量
      • 代码示例:
      • 解释:
    • 4. 方法三:使用局部变量
      • 代码示例:
      • 解释:
    • 5. 方法四:避免过多的函数调用
      • 代码示例:
      • 解释:
    • 6. 方法五:优化循环结构
      • 代码示例:
      • 解释:
    • 7. 方法六:使用列表推导式
      • 代码示例:
      • 解释:
    • 8. 方法七:减少内存占用
      • 代码示例:
      • 解释:
    • 9. 方法八:使用生成器代替列表
      • 代码示例:
      • 解释:
    • 10. 方法九:使用set代替list进行查找
      • 代码示例:
      • 解释:
    • 11. 方法十:缓存函数结果(Memoization)
      • 代码示例:
      • 解释:
    • 12. 方法十一:多线程与多进程
      • 代码示例:
      • 解释:
    • 13. 方法十二:优化 I/O 操作
      • 代码示例:
      • 解释:
    • 14. 方法十三:并行计算与分布式计算
      • 代码示例:
      • 解释:
    • 15. 方法十四:使用高效的数据结构(如 deque, heapq 等)
      • 代码示例:
      • 解释:
    • 16. 方法十五:优化算法
      • 代码示例:
      • 解释:
    • 17. 总结

Python程序15个提速优化方法

1. 引言

Python 是一门简单且强大的编程语言,但其性能在某些场景下可能不如其他语言。通过合适的优化方法,我们能够显著提升 Python 程序的执行效率。本文将探讨 15 个有效的 Python 提速优化方法,每个方法都配有实际的代码示例和详细的解释。


2. 方法一:使用内建函数

Python 的内建函数往往经过优化,能够提供更高效的执行速度。例如,sum()min()max() 等函数的实现比手动循环实现的效率高得多。

代码示例:

class SpeedOptimizer:def __init__(self, data):self.data = datadef optimized_sum(self):return sum(self.data)def custom_sum(self):total = 0for item in self.data:total += itemreturn total# 测试代码
data = list(range(1000000))
optimizer = SpeedOptimizer(data)
print(optimizer.optimized_sum())  # 使用内建函数
print(optimizer.custom_sum())     # 使用自定义循环

解释:

  • sum() 是 Python 内建函数,其底层采用了高效的 C 实现。手动实现的 custom_sum() 使用了显式的 for 循环,性能较差。

3. 方法二:避免使用全局变量

全局变量会影响 Python 的性能,因为每次访问全局变量时都需要进行查找。而局部变量在函数中会被缓存,访问速度更快。

代码示例:

class SpeedOptimizer:def __init__(self, data):self.data = datadef global_variable_access(self):global datareturn sum(data)def local_variable_access(self):data = self.data  # 在函数内部定义局部变量return sum(data)# 测试代码
data = list(range(1000000))
optimizer = SpeedOptimizer(data)
print(optimizer.global_variable_access())  # 使用全局变量
print(optimizer.local_variable_access())   # 使用局部变量

解释:

  • global_variable_access() 使用了全局变量 data,每次访问都会进行全局查找,导致性能下降。相比之下,local_variable_access() 通过局部变量 data 提高了访问速度。

4. 方法三:使用局部变量

与全局变量相比,局部变量在函数执行时会被缓存,因此访问速度更快。我们应该尽量在函数内使用局部变量。

代码示例:

class SpeedOptimizer:def __init__(self, data):self.data = datadef optimize_function(self):result = 0for i in self.data:result += ireturn resultdef optimized_function(self):total = sum(self.data)return total# 测试代码
data = list(range(1000000))
optimizer = SpeedOptimizer(data)
print(optimizer.optimize_function())  # 使用自定义累加
print(optimizer.optimized_function()) # 使用内建的sum函数

解释:

  • optimize_function() 手动累加数据,而 optimized_function() 则直接使用了 sum()。尽管两者都在局部作用域内进行操作,但使用内建函数可以进一步提高性能。

5. 方法四:避免过多的函数调用

频繁的函数调用会增加额外的开销,特别是在循环中。如果函数体非常小,考虑将其内联到代码中。

代码示例:

class SpeedOptimizer:def __init__(self, data):self.data = datadef function_call(self, num):return num * numdef optimized(self):total = 0for num in self.data:total += self.function_call(num)return total# 测试代码
data = list(range(1000))
optimizer = SpeedOptimizer(data)
print(optimizer.optimized())  # 调用函数

解释:

  • 通过减少函数调用的次数,可以提高代码执行效率。比如,function_call() 里每次计算 num * num 时,我们可以直接内联到 optimized() 中,减少函数调用开销。

6. 方法五:优化循环结构

Python 的 for 循环相较于 C++ 等语言比较慢。通过使用内建函数、列表推导式或者生成器表达式来减少循环的开销。

代码示例:

class SpeedOptimizer:def __init__(self, data):self.data = datadef loop_method(self):total = 0for i in self.data:total += ireturn totaldef optimized_method(self):return sum(self.data)# 测试代码
data = list(range(1000000))
optimizer = SpeedOptimizer(data)
print(optimizer.loop_method())  # 使用循环
print(optimizer.optimized_method())  # 使用内建函数

解释:

  • optimized_method() 使用了 sum(),在大数据量下明显优于逐项相加的 loop_method()

7. 方法六:使用列表推导式

列表推导式是 Python 中非常高效的处理集合数据的方式,通常比传统的 for 循环要快。

代码示例:

class SpeedOptimizer:def __init__(self, data):self.data = datadef normal_loop(self):result = []for i in self.data:result.append(i * 2)return resultdef list_comprehension(self):return [i * 2 for i in self.data]# 测试代码
data = list(range(1000000))
optimizer = SpeedOptimizer(data)
print(optimizer.normal_loop())  # 普通循环
print(optimizer.list_comprehension())  # 列表推导式

解释:

  • list_comprehension() 使用了列表推导式,它比 normal_loop() 中的显式 for 循环要高效得多。

8. 方法七:减少内存占用

减少不必要的内存占用可以提高程序的运行速度,特别是当数据量较大时。使用生成器、del 语句等可以有效减少内存使用。

代码示例:

class SpeedOptimizer:def __init__(self, data):self.data = datadef optimized_memory(self):return (i * 2 for i in self.data)# 测试代码
data = list(range(1000000))
optimizer = SpeedOptimizer(data)
gen = optimizer.optimized_memory()
print(next(gen))  # 使用生成器

解释:

  • 使用生成器表达式 optimized_memory() 可以在不将所有结果存储在内存中的情况下处理数据,从而节省内存。

9. 方法八:使用生成器代替列表

生成器不会一次性将数据加载到内存中,而是惰性地生成数据,这在处理大规模数据时特别有效。

代码示例:

class SpeedOptimizer:def __init__(self, data):self.data = datadef generator_method(self):for item in self.data:yield item * 2# 测试代码
data = list(range(1000000))
optimizer = SpeedOptimizer(data)
gen = optimizer.generator_method()
for value in gen:print(value)  # 使用生成器

解释:

  • generator_method() 采用生成器方式处理数据,只在需要时才生成数据,减少内存消耗。

10. 方法九:使用set代替list进行查找

`

set数据结构的查找复杂度是 O(1),而list是 O(n)。在需要频繁查找时,应该使用set`。

代码示例:

class SpeedOptimizer:def __init__(self, data):self.data = datadef list_search(self, value):return value in self.datadef set_search(self, value):data_set = set(self.data)return value in data_set# 测试代码
data = list(range(1000000))
optimizer = SpeedOptimizer(data)
print(optimizer.list_search(100))  # 使用list查找
print(optimizer.set_search(100))   # 使用set查找

解释:

  • set_search() 通过 set 实现常数时间复杂度的查找,相比 list_search() 的 O(n) 要高效得多。

继续基于上述大纲,我将完成剩余部分的内容,并且按照每个方法详细说明,包括代码示例、实现解释以及优化效果。


11. 方法十:缓存函数结果(Memoization)

缓存计算结果(Memoization)可以显著提高性能,尤其是当函数多次被调用且计算相同的输入时。Python 的 functools.lru_cache 是一种简单的缓存技术。

代码示例:

from functools import lru_cacheclass SpeedOptimizer:def __init__(self, data):self.data = data@lru_cache(maxsize=None)def fibonacci(self, n):if n <= 1:return nreturn self.fibonacci(n-1) + self.fibonacci(n-2)# 测试代码
optimizer = SpeedOptimizer([])
print(optimizer.fibonacci(35))  # 使用缓存的斐波那契数列计算

解释:

  • fibonacci() 函数使用了 @lru_cache 装饰器,该装饰器会缓存函数的返回值。对于相同的输入,缓存的结果会被直接返回,从而大大减少了计算时间。对于斐波那契数列的递归计算,缓存可以有效避免重复计算。

12. 方法十一:多线程与多进程

在处理 I/O 密集型任务时,使用多线程可以显著提高性能。而对于计算密集型任务,多进程(利用多核 CPU)会有更好的效果。

代码示例:

import threading
import timeclass SpeedOptimizer:def __init__(self, data):self.data = datadef task(self, num):time.sleep(1)  # 模拟一个I/O密集型任务return num * 2def threaded_optimization(self):threads = []for i in self.data:thread = threading.Thread(target=self.task, args=(i,))threads.append(thread)thread.start()for thread in threads:thread.join()def process_optimization(self):from multiprocessing import Poolwith Pool() as pool:result = pool.map(self.task, self.data)return result# 测试代码
data = list(range(10))
optimizer = SpeedOptimizer(data)
start = time.time()
optimizer.threaded_optimization()  # 使用多线程
print(f"多线程耗时: {time.time() - start}")start = time.time()
optimizer.process_optimization()  # 使用多进程
print(f"多进程耗时: {time.time() - start}")

解释:

  • threaded_optimization() 使用了多线程执行任务,适合 I/O 密集型任务。process_optimization() 使用了多进程,适合计算密集型任务。通过 Pool 类,我们可以轻松并行化多个任务。

13. 方法十二:优化 I/O 操作

I/O 操作通常是 Python 程序中的瓶颈。通过减少不必要的磁盘操作,使用缓冲技术和批量操作,我们可以优化 I/O 性能。

代码示例:

class SpeedOptimizer:def __init__(self, file_name):self.file_name = file_namedef write_file(self, data):with open(self.file_name, 'w') as f:for line in data:f.write(f"{line}\n")def buffered_write_file(self, data):with open(self.file_name, 'w', buffering=1) as f:for line in data:f.write(f"{line}\n")# 测试代码
data = [str(i) for i in range(100000)]
optimizer = SpeedOptimizer("data.txt")
optimizer.write_file(data)  # 不使用缓冲
optimizer.buffered_write_file(data)  # 使用缓冲

解释:

  • write_file() 中,文件写入操作没有使用缓冲,而 buffered_write_file() 则显式启用了缓冲操作。缓冲可以减少磁盘的访问频率,提高性能。

14. 方法十三:并行计算与分布式计算

对于大型数据处理任务,我们可以考虑使用并行计算框架,如 Dask 或 Apache Spark 来分布式处理数据。

代码示例:

import dask.array as daclass SpeedOptimizer:def __init__(self, data):self.data = datadef dask_parallel_computation(self):data_array = da.from_array(self.data, chunks=1000)return data_array.sum().compute()# 测试代码
data = list(range(1000000))
optimizer = SpeedOptimizer(data)
result = optimizer.dask_parallel_computation()
print(result)  # 使用 Dask 进行并行计算

解释:

  • dask_parallel_computation() 使用 Dask 库并行计算数据的总和。Dask 支持对大数据进行分布式计算,自动将数据分为小块并行计算。

15. 方法十四:使用高效的数据结构(如 deque, heapq 等)

在处理频繁的插入和删除操作时,使用高效的数据结构,如 deque(双端队列)和 heapq(堆)可以显著提升性能。

代码示例:

from collections import deque
import heapqclass SpeedOptimizer:def __init__(self, data):self.data = datadef deque_optimization(self):queue = deque(self.data)queue.appendleft(0)  # 高效地在队列头插入元素return queuedef heapq_optimization(self):heapq.heapify(self.data)return heapq.heappop(self.data)# 测试代码
data = list(range(1000000))
optimizer = SpeedOptimizer(data)
deque_result = optimizer.deque_optimization()  # 使用deque
heapq_result = optimizer.heapq_optimization()  # 使用heapq
print(deque_result)
print(heapq_result)

解释:

  • deque_optimization() 使用了 deque 来高效地在队列头插入元素,heapq_optimization() 则通过 heapq 进行最小堆操作,保证插入和删除操作的高效性。

16. 方法十五:优化算法

无论是哪种编程语言,选择合适的算法都能大幅度提高程序的性能。通过减少算法的时间复杂度,我们可以优化程序的执行效率。

代码示例:

class SpeedOptimizer:def __init__(self, data):self.data = datadef bubble_sort(self):arr = self.data[:]for i in range(len(arr)):for j in range(0, len(arr)-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]return arrdef quick_sort(self):if len(self.data) <= 1:return self.datapivot = self.data[len(self.data) // 2]left = [x for x in self.data if x < pivot]middle = [x for x in self.data if x == pivot]right = [x for x in self.data if x > pivot]return self.quick_sort(left) + middle + self.quick_sort(right)# 测试代码
data = [i for i in range(1000, 0, -1)]
optimizer = SpeedOptimizer(data)
print(optimizer.bubble_sort())  # 冒泡排序
print(optimizer.quick_sort())  # 快速排序

解释:

  • bubble_sort() 实现了经典的冒泡排序,时间复杂度为 O(n²),而 quick_sort() 实现了快速排序,时间复杂度为 O(n log n),显然快速排序在处理大数据时更加高效。

17. 总结

本文介绍了 15 种 Python 程序提速优化方法,从使用内建函数、优化循环结构、减少内存占用,到多线程、多进程、缓存技术、并行计算等一系列技巧,每个方法都配有 Python 代码示例和详细解释。通过这些优化技巧,我们可以显著提升程序的执行效率,特别是在处理大数据和高并发时。

Python 是一门非常灵活的语言,但性能瓶颈可能会在某些场景下影响开发效率。通过合理的优化策略,能够最大限度地发挥其潜力,从而提高开发效率和程序的运行速度。


以上就是完整的 Python 程序提速优化方法的博客内容,涵盖了性能优化的方方面面,您可以根据实际情况调整和补充更多的案例和细节。

相关文章:

Python程序15个提速优化方法

目录 Python程序15个提速优化方法1. 引言2. 方法一&#xff1a;使用内建函数代码示例&#xff1a;解释&#xff1a; 3. 方法二&#xff1a;避免使用全局变量代码示例&#xff1a;解释&#xff1a; 4. 方法三&#xff1a;使用局部变量代码示例&#xff1a;解释&#xff1a; 5. 方…...

足球虚拟越位线技术FIFA OT(二)

足球虚拟越位线技术FIFA OT&#xff08;二&#xff09; 在FIFA认证测试过程中&#xff0c;留给VAR系统绘制越位线的时间只有90秒&#xff08;在比赛中时间可能更短&#xff09;&#xff0c;那么90秒内要做什么事呢&#xff0c;首先场地上球员做出踢球动作&#xff0c;然后VAR要…...

centos7.9单机版安装K8s

1.安装docker [rootlocalhost ~]# hostnamectl set-hostname master [rootlocalhost ~]# bash [rootmaster ~]# mv /etc/yum.repos.d/* /home [rootmaster ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo [rootmaster ~]# cu…...

图像编辑一些概念:Image Reconstruction与Image Re-generation

图像编辑本质上是在“图像重建”&#xff08;image reconstruction&#xff09;和“图像再生成”&#xff08;image re-generation&#xff09;之间寻找平衡。 1. Image Reconstruction&#xff08;图像重建&#xff09; 定义&#xff1a;图像重建通常是指从已有的图像中提取信…...

【STM32】在 STM32 USB 设备库添加新的设备类

说实话&#xff0c;我非常想吐槽 STM32 的 USB device library&#xff0c;总感觉很混乱。 USB Device library architecture 根据架构图&#xff1a; Adding a custom class 如果你想添加新的设备类&#xff0c;必须修改的文件有 usbd_desc.cusbd_conf.cusb_device.c 需要…...

【Redis】Redis实现的消息队列

一、用list实现【这是数据类型所以支持持久化】 消息基于redis存储不会因为受jvm内存上限的限制&#xff0c;支持消息的有序性&#xff0c;基于redis的持久化机制&#xff0c;只支持单一消费者订阅&#xff0c;无法避免消息丢失。 二、用PubSub【这不是数据类型&#xff0c;是…...

# Spring事务

Spring事务 什么是spring的事务&#xff1f; 在Spring框架中&#xff0c;事务管理是一种控制数据库操作执行边界的技术&#xff0c;确保一系列操作要么全部成功&#xff0c;要么全部失败&#xff0c;从而维护数据的一致性和完整性。Spring的事务管理主要关注以下几点&#xf…...

Java学习笔记--数组常见算法:数组翻转,冒泡排序,二分查找

一&#xff0c;数组翻转 1.概述:数组对称索引位置上的元素互换&#xff0c;最大值数组序号是数组长度减一 创建跳板temp&#xff0c;进行min和max的互换&#xff0c;然后min自增&#xff0c;max自减&#xff0c;当min>max的时候停止互换&#xff0c;代表到中间值 用代码实…...

ARM 架构(Advanced RISC Machine)精简指令集计算机(Reduced Instruction Set Computer)

文章目录 1、ARM 架构ARM 架构的特点ARM 架构的应用ARM 架构的未来发展 2、RISCRISC 的基本概念RISC 的优势RISC 的应用RISC 与 CISC 的对比总结 1、ARM 架构 ARM 架构是一种低功耗、高性能的处理器架构&#xff0c;广泛应用于移动设备、嵌入式系统以及越来越多的服务器和桌面…...

7.STM32之通信接口《精讲》之USART通信---多字节数据收发(数据包的模式:HEX数据包和文本数据包)

根据上一节的HEX数据包的设计完成&#xff0c;本节将完成文本数据包的编写&#xff0c;&#xff08;HEX数据包其实本质就是原始数据&#xff0c;文本数据包我么要接收到还要对照ASCll进行解析封装&#xff09; 有不懂的可参考上一节的讲解&#xff01;&#xff01;&#xff…...

基于Vue+SpringBoot的求职招聘平台

平台概述 本平台是一个高效、便捷的人才与职位匹配系统&#xff0c;旨在为求职者与招聘者提供一站式服务。平台内设三大核心角色&#xff1a;求职者、招聘者以及超级管理员&#xff0c;每个角色拥有独特的功能模块&#xff0c;确保用户能够轻松完成从信息获取到最终录用的整个…...

WebRTC 和 WebSocket

WebRTC 和 WebSocket 是两种不同的技术&#xff0c;虽然它们都用于在浏览器之间进行通信&#xff0c;但它们的设计目标和使用场景有所不同。以下是它们之间的主要区别&#xff1a; 目的和使用场景 WebRTC: 主要用于实现实时音视频通信。 支持点对点&#xff08;P2P&#xff09…...

小车综合玩法--5.画地为牢

一、实验准备 前面我们利用四路巡线模块巡线&#xff0c;现在我们利用这个特性&#xff0c;用黑线将小车围起来&#xff0c;让小车一直在我们围的圈内运动。 1.小车接线已安装&#xff0c;且安装正确 2.调试四路巡线模块遇黑线时指示灯亮。不是黑线时指示灯灭。 二、实验原理…...

数据库课程设计全流程:方法与实例解析

--- ### 一、数据库课程设计概述 数据库课程设计是学习数据库理论知识的重要实践环节&#xff0c;旨在帮助学生掌握数据库设计和应用系统开发的完整流程&#xff0c;包括需求分析、数据库设计、功能实现以及性能优化。 #### **设计目标** 1. 掌握数据库设计的基本步骤和原则…...

用Ruby编写一个自动化测试脚本,验证网站登录功能的正确性。

测试准备&#xff1a;从江河湖海到代码世界的奇妙之旅 亲爱的朋友们&#xff0c;你们好&#xff01;今天我要带你们进入一个神奇的世界——测试的世界。在这里&#xff0c;我们将会看到各种各样的测试用例&#xff0c;它们就像江河湖海一样&#xff0c;汇聚在一起&#xff0c;…...

跳表 | 基本概念 | 代码实现

文章目录 1.跳表的基本概念2.跳表的结构3.跳表的增删改查4.完整代码 1.跳表的基本概念 跳表的本质是一种查找结构&#xff0c;一般查找问题的解法分为两个大类&#xff1a;一个是基于各种平衡树&#xff0c;一个是基于哈希表&#xff0c;跳表比较的特殊&#xff0c;它独成一派…...

分数加减

#include <stdio.h> #include <stdlib.h>// 求最大公因数 int gcd(int a, int b) {return b 0? a : gcd(b, a % b); }// 化简分数 void simplify(int *num, int *den) {int g gcd(*num, *den);*num / g;*den / g;if (*den < 0) {*num * -1;*den * -1;} }//…...

基于卷积神经网络的皮肤病识别系统(pytorch框架,python源码,GUI界面,前端界面)

更多图像分类、图像识别、目标检测等项目可从主页查看 功能演示&#xff1a; 皮肤病识别系统 vgg16 resnet50 卷积神经网络 GUI界面 前端界面&#xff08;pytorch框架 python源码&#xff09;_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积神经网络的皮肤病识…...

QT与嵌入式——获取网络实时时间

目录 1、使用QT通过网络API接口获取网络实时时间 1.1、首先在网上找一个获取实时时间的API接口 1.2、 根据第一步获取的链接来发送请求 1.3、通过connect链接信号与槽 注意的点&#xff1a; 2、为什么需要网络实时时间 3、获取本机的实时时间 4、顺带提一句 1、使用QT通过…...

优化装配,提升品质:虚拟装配在汽车制造中的关键作用

汽车是各种零部件的有机结合体&#xff0c;因此汽车的装配工艺水平和装配质量直接影响着汽车的质量与性能。在汽车装配过程中&#xff0c;经常会发生零部件间干涉或装配顺序不合理等现象&#xff0c;且许多零部件制造阶段产生的质量隐患要等到实际装配阶段才能显现出来&#xf…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...