简单6个技巧轻轻松松提升Python代码性能!

在这里插入图片描述

很多小伙伴们总是会吐槽 Python 的性能速度慢。但是事实上程序运行速度的快慢都在很大程度上取决于编写程序的开发人员,以及开发人员的算法能力和对代码的优化能力。Python 虽然在运行效率上有所欠缺,但是值得一提的是在开发效率方面 Python 却比其它编程语言高很多。为了弥补 Python 在运行效率上的不足,所以小编在本文为大家介绍提升 Python 代码性能的技巧。

代码性能检测

  • 在对代码进行优化之前,通常需要检测是哪些代码片段拖慢了整个程序的运行速度。在这里笔者推荐三个方法帮助开发者们找出程序的瓶颈,这样就知道应该把注意力放在哪里。
  • 以一个 Python 实现斐波那契数列的程序为示例:
# 斐波那契数列def Fibonacci():    
a, b = 0, 1    i = 0    
while i < 100:        
print(b)        
a, b = b, a+b        
i += 1   Fibonacci()`   `

使用 timeit 库

  • timeit 模块是 Python 的内置模块。timeit 模块致力于衡量代码的性能,模块内提供了许多个函数和类,以便开发者能够精确地测量代码的执行时间。timeit 模块用法较为简单,适合用来计算一小段代码的运行时间。
  • 代码示例:
import timeit def Fibonacci():    
a, b = 0, 1    
i = 0    
while i < 100:        
print(b)        
a, b = b, a+b        
i += 1result = timeit.timeit(Fibonacci, number=5)
print(f"Fibonacci函数的运行时间为: {result}")`   `
  • 运行结果:
    在这里插入图片描述

使用 memory_profiler 库

  • memory_profiler 是 Python 的第三方库(需要使用 pip 命令进行安装),是一个可根据每行代码查看内存占用的工具。开发者使用 memory_profiler 库可以有效的定位到程序中占有内存最多的代码,以此找到程序运行的瓶颈。
  • pip 命令安装:
    在这里插入图片描述
  • 代码示例:
from memory\_profiler 
import profile@profiledef Fibonacci():    
a, b = 0, 1    
i = 0    
while i < 100:        
print(b)        
a, b = b, a+b        
i += 1Fibonacci()`   `
  • 运行结果:
    在这里插入图片描述

使用 line_profiler 库

  • 和 memory_profiler 类似,line_profiler 也是 Python 的第三方库,是一个可以逐行参看代码运行耗时的分析工具。
    代码示例:
from line\_profiler 
import LineProfilerdef Fibonacci():    
a, b = 0, 1    
i = 0    
while i < 100:        
print(b)        
a, b = b, a+b        
i += 1lp = LineProfiler() lp\_wrap = lp(Fibonacci)lp\_wrap() 
# 输出统计数据lp.print\_stats()`   `
  • 运行结果:
    在这里插入图片描述

接下来就开始介绍提升 Python 代码性能的六个技巧:

1.使用内置函数和库

  • Python 的内置函数和库与我们常用的自定义函数、自定义数据类型相比,运行速度会显得非常快。这主要是因为内置数据类型的底层是使用 C 语言实现的,而 C 语言又是目前为止执行效率最高的高级语言,这是使用 Python 所无法比较的。而且 Python 的开发团队也对这些内置函数和库进行了良好的测试和优化。
  • 示例代码:
my_list = []word_list = "hello,world"for word in word_list:    
my_list.append(word.upper())print(my_list)
  • 更好的方法:
word_list = "hello,world"
# 使用内置map函数my_list = map(str.upper, word_list)print(list(my_list))

2.使用内插字符串 f-string

  • 在 Python 程序中,使用支持插值的 f-string 取代 C 风格的格式字符串与 str.format 方法,会使得字符串操作效率得到提高。根据《Effective Python》一书中的介绍, 使用 f-string 是个简洁而强大的机制,它在简洁性、可读性和速度方面都比其他构建字符串的方式要更好。
  • 示例代码:
places = 3number = 1.23456my\_str = "number值和places值分别为{0}和{1}".format(number, places)print(my\_str)`   `
  • 更好的方法:
places = 3number = 1.23456my\_str = f"number值和places值分别为{number}{places}"print(my\_str)`   `

3.使用列表推导式

  • 在小片段的 Python 代码中,使用列表推导式代替循环语句可以使得代码更加简洁易读;在大型项目中,相较于使用循环语句,使用列表推导式的执行效率也会更高。这是因为列表推导式是直接在 C 语言的环境下运行的,所以速度更快,而循环语句的解析执行往往比列表推导式的步骤更多,所以速度就更慢。
  • 示例代码:
my\_list = \[\] 
# 计算1到100以内的奇数for i in range(1, 100):     
if i % 2 == 1:        
my\_list.append(i)print(my\_list)`   `
  • 更好的方法:
my\_list = \[i for i in range(1, 100) if i % 2 == 1\]print(my\_list)`   `

4.使用 lru_cache 装饰器缓存数据

  • 将程序执行时的信息存储在缓存中可以使程序运行的更加高效。在 Python 中也可以导入functools 库中的 lru_cache 装饰器来实现缓存操作,该操作会在内存中存储特定类的缓存,以此来达到程序更快的驱动速度。
  • 示例代码:
import time``   ``
def my_func(x):``
time.sleep(2)       
# 模拟程序执行时间``
return x``   ``
print(my_func(1))``
print("=========")``
print(my_func(1))
  • 更好的方法:
import functools``
import time``   ``
# 最多缓存128个不同的结果``
@functools.lru_cache(maxsize=2)``
def my_func(x):``
time.sleep(2)       
# 模拟程序执行时间``
return x``   ``
print(my_func(1))``
print("=========")``
print(my_func(1))       
# 结果已被缓存,无需等待立即返回

5.针对循环结构的优化

  • 在通常情况下,循环语句在程序中的执行总是会占据大量时间。因此我们开发 Python 程序时都会强调优化其中的循环结构,比方说避免在一个循环中使用点操作符和不必要的重复操作等。
  • 示例代码:
my_list = []``
word_list = ["hello,", "word"]``   ``
for word in word_list:  ``    
new_str = str.lower(word)        
# 不必要的重复操作和点运算符``
my_list.append(new_str)``   ``
print(my_list)
  • 更好的方法:
my_list = []``word_list = ["hello,", "word"]``lower = str.lower``   ``
for word in word_list:``
my_list.append(lower(word))``   ``
print(my_list)``   

6.选择合适算法和数据结构

  • 提到代码的运行效率,就不得不提到算法和数据结构能力了。算法也就是程序解决问题的步骤,而数据结构是指数据的存储和组织。选择合适的算法和数据结构,可以在很大程度上提升 Python 代码的运行效率。
  • 示例代码:
# 在有序数组中,使用二分查找算法查找元素要比使用顺序查找算法效率更高``
def sequential_search(nums,target):``
for num in nums:``
if num == target:``
return nums.index(num)``
return -1      
# 返回-1表示没有找到目标元素``   ``
nums = [1, 8, 10, 11, 22]``target = 11``
print(sequential_search(nums, target))
  • 更好的方法:
# 二分查找``def binary_search(nums,target):``
first,last = 0, len(nums) - 1           
# 定义数组的第一个元素下标和最后一个元素下标``    
while first <= last:                    
#左闭右闭区间``
mid_index = (first + last) // 2     
#中间元素的下标值``   ``
if nums[mid_index] < target:``            
first = mid_index + 1``
elif nums[mid_index] > target:``
last = mid_index - 1``
else:``
return mid_index``    
return -1``   ``
nums = [1, 8, 10, 11, 22]``target = 11``
print(binary_search(nums, target))

好啦,以上就是小编今天分享的六个提高Python代码性能的技巧,希望对小伙伴们有所帮助!

图片

总结

  • 最后希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!

文末福利

  • 最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。

包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】领取!

  • ① Python所有方向的学习路线图,清楚各个方向要学什么东西
  • ② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
  • ③ 100多个Python实战案例,学习不再是只会理论
  • ④ 华为出品独家Python漫画教程,手机也能学习

可以扫描下方二维码领取【保证100%免费

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值