Python有哪些节约时间的技巧?

本文介绍了20个节省时间的Python编程技巧,包括字符串反转、首字母大写、查找唯一元素、列表推导式、变量交换等,旨在提高Python程序员的工作效率。

本文番茄加速为大家介绍Python有哪些节约时间的技巧,可以提升编程技术,对日常工作非常有用。在这里插入图片描述

1 字符串反转

使用切片反转字符串。

str1=“qwert” rev_str1=str1[::-1] #输出 # trewq

2 使首字母大写

将字符串转换为首字母大写。使用 title()方法完成的。

str1=“this is a book” print(str1.title()) # This Is A Book

3 在字符串中查找唯一元素

下面代码可用于查找字符串中所有的唯一元素。

str1="aabbccccdddd"set1=set(str1) new_str=’’.join(set1) print(new_str)

4 重复打印字符串或列表

下面的代码中,对字符串或列表使用(*)。把字符串或列表复制多次。

i=4 str1=“abcd” list1=[1,2] print(str1i) # abcdabcdabcdabcd print(list1i) # [1,2,1,2,1,2,1,2]

5 列表推导式

列表推导式为我们提供了一种在其他列表基础上创建列表的好方法。下面代码通过将旧列表的每个元素乘以 2 来创建新列表。

list1=[1,2,3] new_list1=[2*i for i in list1] # [2,4,6]

6 交换变量

不使用另一个变量,实现变量交换。

x=1 y=2 x,y=y,x print(x) # 2 print(y) # 1

7 将字符串拆分为子字符串列表

我们使用字符串类中的.split()方法将字符串拆分为子字符串列表,还可以将要分割的分隔符作为参数传递。

str1="This is a book"str2="test/ str 2"print(str1.split()) # [‘This’, ‘is’, ‘a’, ‘book’] print(str2.split(’/’)) # [‘test’, ’ str 2’]

8 将字符串列表组合成单个字符串

join()将作为参数传递的字符串列表组合为单个字符串。这种情况下,我们使用逗号分隔符将它们分开。

list_str=[‘This’,‘is’,‘a’,‘book’]print(’,’.join(list_str))# This,is,a,book

9 检查回文字符串

我们已经讨论过如何反转字符串,因此回文字符串在 Python 中判断起来非常简单。

str1="qqaabb"if str1==str1[::-1]: print(“回文”)else: print(“不是”) # 不是

10 列表中的元素统计

使用 Python Counter 类。Python 计数器跟踪容器中每个元素的频数, Counter()返回一个字典,元素作为键,频数作为值。

另外使用 most_common()函数来获取列表中的 出现次数最多的元素。

from collections import Counterlist1=[‘a’,‘b’,‘a’,‘c’,‘c’,‘c’]count=Counter(list1)print(count)print(count[‘b’])print(count.most_common(1))

11 判断两个字符串是否为异序词

异序词是通过重新排列不同单词或短语的字母而形成的单词或短语。如果两个字符串的 Counter 对象相等,那么它们就是相同字母异序词对。

s1,s2,s3=“acbde”,“abced”,"abcda"c1,c2,c3=Counter(s1),Counter(s2),Counter(s3)if c1c2: print(‘1和2是异序词’) if c1c3: print(‘1和3是异序词’)

12 使用 try-except-else 块

try / except 是 Python 中的异常处理模块,添加 else 语句,会在 try 块中没有引发异常的情况下运行。

a,b=1,0try: print(a/b) # b为0的时候触发异常except ZeroDivisionError: print(“除数为0”)else: print(“不存在异常”)finally: print(“此段总是会执行”)

13 通过枚举获取索引 / 值对

可以使用下面的脚本,遍历列表中的值及其索引。

list1=[‘a’,‘b’,‘c’,‘d’,‘e’]for idx,val in enumerate(list1): print(’{0}:{1}’.format(idx,val))# 0:a# 1:b# 2:c# 3:d# 4:e

14 获取对象的内存使用信息

下面脚本可用于检查对象的内存使用信息。

import sysnum=21print(sys.getsizeof(num))

15 合并两个字典

在 Python 2 中,使用 update()合并两个字典,Python 3 变得更加简单。

下面脚本中,两个字典被合并。在相交的情况下,使用第二个字典中的值。

dic1={‘app’:9,‘banana’:6}dic2={‘banana’:4,‘orange’:8}com_dict={**dic1,**dic2}# {‘apple’:9,‘banana’:4,‘orange’:8}

16 计算代码执行所需的时间

下面代码使用库函数来计算执行代码所需的时间消耗多少毫秒。

import times_time=time.time()a,b=1,2c=a+b e_time=time.time()time_taken_in_micro=(e_time-stime)*(10**6)print(“程序运行的毫秒:{0} ms”.format(time_taken_in_micro))

17 展开列表清单

有时不知道列表的嵌套深度,并且只想把所有元素放在一个普通列表中。可以通下面的方法得到数据:

from iteration_utilities import deepflatten# 如果嵌套列表的深度只有1层def flatten(l): return [item for sublist in l for item in sublist]l=[[1,2,3],[3]]print(flatten(l))# [1,2,3,3]# 如果不知道列表嵌套深度l=[[1,2,3],[4,[5],[6,7]],[8,[9,[10]]]]print(list(deepflatten(l,depth=3)))# [1,2,3,4,5,6,7,8,9,10]

18 从列表中随机取样

下面代码从给定列表中生成了 n 个随机样本。

import randomlist1=[‘a’,‘b’,‘c’,‘d’,‘e’]ns=2samples=random.sample(list1,ns)print(samples)# [‘a’,‘c’]

或者使用secrets库生成随机样本进行, 下面代码仅适用于 Python 3.x。

import secretss_rand=secrets.SystemRanom()list1=[‘a’,‘b’,‘c’,‘d’,‘e’]ns=2samples=s_rand.sample(list1,ns)print(samples)# [‘c’,‘d’]

19 数字列表化

下面代码将整数转换为数字列表。

nums=123456# 使用mapdigit_list=list(map(int,str(nums)))print(digit_list)# [1,2,3,4,5,6]# 使用列表表达式digit_list=[int(x) for x in str(nums)]print(digit_list)# [1,2,3,4,5,6]

20 唯一性检查

下面的函数检查列表中的元素是否唯一。

def unique(l): if len(l)==len(set(l)): print(“所有元素是唯一的”) else: print(“存在重复”) unique([1,2,3,4]) # 所有元素是唯一的 unique([1,1,3,4]) # 存在重复

<think>我们正在讨论单片机程序内存优化的实用技巧。根据引用[1]中提到的内存结构,我们有寄存器、Cache(可选)、RAM(运行时数据)、Flash(程序代码和常量)这几个层次。优化需要针对这些不同的内存区域进行。 主要优化目标: 1. 减少RAM使用(包括栈、堆、全局变量) 2. 减少Flash(程序存储器)占用 3. 提高代码执行效率(利用寄存器、Cache等) 具体技巧如下: 一、Flash空间优化(程序存储空间) 1. 代码压缩: - 使用编译器优化选项(如Keil中的O2、O3优化等级) - 删除未使用的函数和变量(通过编译器警告和map文件分析) - 利用链接器选项移除未使用的段(Section) 2. 函数复用: - 将重复代码封装成函数 - 使用查表法替代复杂计算(尤其适用于三角函数、对数等) 例如:将正弦函数值预先存储为数组 ```c const uint8_t code sin_table[] = {0,4,8,13,17,21,25,29,33,37,41,...}; ``` 3. 精简算法: - 选择空间复杂度更低的算法 - 用定点数代替浮点数运算(如用`int`模拟小数运算) 例如:计算平均值时避免使用浮点 ```c // 用整数运算代替浮点 uint16_t average = (sum + count/2) / count; // 四舍五入 ``` 4. 使用const和code关键字(针对51架构): - 将常量数据放入Flash(避免占用RAM) 例如: ```c const char code welcome_msg[] = "Hello, World!"; ``` 二、RAM空间优化(数据存储空间) 1. 变量类型优化: - 使用最小数据类型(如`uint8_t`代替`int`) - 避免使用`long`和`double`(除非必要) 2. 变量作用域缩小: - 使用局部变量代替全局变量(局部变量在栈上分配,使用完后释放) - 使用静态局部变量(`static`)代替全局变量(限制作用域) 3. 内存复用: - 共用体(Union)实现变量复用 例如: ```c union { uint16_t word; struct { uint8_t low; uint8_t high; } bytes; } converter; ``` 4. 栈空间优化: - 减少函数嵌套深度 - 避免大数组作为局部变量(可改为静态或全局) 5. 堆空间管理: - 避免在嵌入式系统中使用动态内存分配(`malloc/free`),以免产生碎片 - 若必须使用,采用固定大小的内存池 三、执行效率优化(利用寄存器与Cache) 1. 寄存器变量: - 使用`register`关键字提示编译器将频繁使用的变量放入寄存器 例如:`register uint8_t i;` - 注意:现代编译器通常自动优化,此方法效果有限 2. 循环优化: - 循环展开(减少循环条件判断次数) 例如: ```c // 展开前 for(i=0; i<4; i++) { sum += data[i]; } // 展开后 sum += data[0]; sum += data[1]; sum += data[2]; sum += data[3]; ``` - 避免在循环内调用函数(尤其耗时函数) 3. 数据对齐: - 将常用数据对齐到机器字长边界(提高访问速度) - 例如:`uint32_t`变量地址应为4的倍数 4. 利用Cache: - 如果单片机有Cache,安排代码顺序使跳转局部化 - 将频繁访问的数据集中存放(提高Cache命中率) 四、其他高级技巧 1. 使用汇编关键函数: - 对性能要求极高的函数用汇编重写(如FFT、数字滤波) 2. 压缩存储+运行时解压: - 将非关键数据(如图形、字体)压缩存储,使用时解压(用时间换空间) 3. 分时加载: - 将不同时使用的功能模块分时加载到RAM(需要外部存储器支持) 示例:用查表法优化LED数码管显示(节约计算资源)[^1] ```c // 数码管显示0~9的段码(共阴) const uint8_t code LED_Table[10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; void DisplayDigit(uint8_t digit) { P0 = LED_Table[digit]; // 直接查表输出 } ``` 注意事项: - 优化前先测量(使用编译器的map文件分析内存占用) - 遵循“先正确后优化”原则 §§相关问题§§ 1. 如何分析Keil编译器生成的map文件? 2. 单片机系统中如何避免栈溢出? 3. 嵌入式系统中使用动态内存分配有哪些风险? 4. 如何利用编译器优化等级平衡性能与代码大小? </think>以下是单片机程序内存优化的实用技巧,结合单片机内存结构和实际应用场景,从Flash(程序存储)和RAM(数据存储)两个维度进行优化: ### 一、Flash空间优化(程序存储) 1. **代码压缩技术** - 使用编译器最高优化等级(如Keil的`-O3`) - 复用公共代码段(如将通用操作封装为函数) - 查表法替代复杂运算: ```c const uint8_t code sin_table[90] = {0,4,9,13,...}; // 替代sin()函数 uint8_t angle_val = sin_table[angle]; // $O(1)$时间复杂度 ``` 2. **指令集优化** - 优先使用单片机原生指令(如51系列的`DJNZ`循环指令) - 避免浮点运算(用定点数代替): ```c int temperature = adc_val * 100 / 4096; // 代替float计算 ``` 3. **常量存储策略** - 使用`code`关键字强制常量存入Flash(针对8051): ```c const char code welcome_msg[] = "System Ready!"; // 不占RAM ``` ### 二、RAM空间优化(数据存储) 1. **变量精细化管理** - 使用最小数据类型(如`uint8_t`替代`int`) - 位域压缩技术: ```c struct { uint8_t flag1 : 1; // 仅占1位 uint8_t flag2 : 2; // 占2位 } status_reg; // 总大小1字节 ``` 2. **内存复用技术** - 共用体(Union)共享内存空间: ```c union { uint16_t sensor_val; uint8_t bytes[2]; // 与sensor_val共享内存 } adc_data; ``` 3. **动态内存规避** - 静态分配替代`malloc`(避免内存碎片) - 预分配缓冲区池: ```c #define BUF_SIZE 32 uint8_t buf_pool[4][BUF_SIZE]; // 静态内存池 ``` ### 三、执行效率优化 1. **寄存器变量优化** ```c register uint8_t i; // 提示编译器优先使用寄存器 for(i=0; i<100; i++){...} ``` 2. **循环展开策略** ```c // 原始循环(6字节指令) for(int i=0; i<3; i++) PORT = led_pattern[i]; // 展开后(节省跳转指令) PORT = led_pattern[0]; PORT = led_pattern[1]; PORT = led_pattern[2]; // 减少2字节 ``` 3. **数据对齐访问** ```c __attribute__((aligned(4))) uint32_t buffer[8]; // 4字节对齐 ``` ### 四、高级优化技巧 1. **覆盖链接(Overlay)** ```mermaid graph LR A[主程序] --> B[功能模块A] A --> C[功能模块B] style B fill:#f9f,stroke:#333 style C fill:#f9f,stroke:#333 ``` 互斥模块共享同一RAM区域,通过链接器配置实现[^1] 2. **压缩存储+运行时解压** ```python # 预处理阶段(PC端) compressed_data = lzss.compress(raw_data) ``` ```c // MCU运行时 lzss_decompress(compressed_data, RAM_buffer); ``` ### 五、优化验证工具 1. **Map文件分析** - 查看`CODE`(Flash)和`DATA`/`XDATA`(RAM)段分布 - 定位内存占用最大的函数(如排序算法优化空间) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值