Python性能优化:让你的代码飞起来

张开发
2026/4/14 7:18:31 15 分钟阅读

分享文章

Python性能优化:让你的代码飞起来
Python性能优化让你的代码飞起来前言大家好我是第一程序员名字大人很菜。作为一个非科班转码、正在学习Rust和Python的萌新最近我开始关注Python的性能优化。说实话一开始我觉得Python的性能已经足够好了但当我处理大型数据集或复杂计算时我发现Python的性能确实存在一些瓶颈。今天我想分享一下我对Python性能优化的学习心得希望能给同样是非科班转码的朋友们一些参考。一、性能分析工具1.1 使用time模块最简单的性能分析方法是使用time模块import time start_time time.time() # 执行需要测试的代码 result sum(range(1000000)) end_time time.time() print(fExecution time: {end_time - start_time} seconds)1.2 使用cProfile模块cProfile是Python的内置性能分析器import cProfile def calculate_sum(): result sum(range(1000000)) return result cProfile.run(calculate_sum())1.3 使用line_profilerline_profiler可以分析每行代码的执行时间# 安装line_profiler # pip install line_profiler from line_profiler import LineProfiler def calculate_sum(): result 0 for i in range(1000000): result i return result lp LineProfiler() lp_wrapper lp(calculate_sum) lp_wrapper() lp.print_stats()二、代码优化技巧2.1 使用内置函数Python的内置函数通常是用C实现的执行速度比纯Python代码快# 慢 result 0 for i in range(1000000): result i # 快 result sum(range(1000000))2.2 使用列表推导式列表推导式比传统的for循环快# 慢 squares [] for i in range(1000000): squares.append(i ** 2) # 快 squares [i ** 2 for i in range(1000000)]2.3 使用生成器生成器比列表更节省内存# 消耗内存 numbers [i for i in range(1000000)] # 节省内存 numbers (i for i in range(1000000))2.4 避免频繁的字符串拼接使用join方法比使用操作符更高效# 慢 result for i in range(10000): result str(i) # 快 result .join(str(i) for i in range(10000))2.5 使用局部变量局部变量的访问速度比全局变量快# 慢 import math def calculate(): result 0 for i in range(1000000): result math.sqrt(i) return result # 快 import math def calculate(): sqrt math.sqrt result 0 for i in range(1000000): result sqrt(i) return result三、算法优化3.1 选择合适的算法选择时间复杂度较低的算法# 线性搜索时间复杂度O(n) def linear_search(arr, target): for i in range(len(arr)): if arr[i] target: return i return -1 # 二分搜索时间复杂度O(log n) def binary_search(arr, target): low 0 high len(arr) - 1 while low high: mid (low high) // 2 if arr[mid] target: return mid elif arr[mid] target: low mid 1 else: high mid - 1 return -13.2 使用合适的数据结构选择合适的数据结构可以提高性能# 列表查找时间复杂度O(n) my_list [1, 2, 3, 4, 5] print(3 in my_list) # 慢 # 集合查找时间复杂度O(1) my_set {1, 2, 3, 4, 5} print(3 in my_set) # 快 # 字典查找时间复杂度O(1) my_dict {1: a, 2: b, 3: c} print(3 in my_dict) # 快四、内存优化4.1 使用合适的数据类型选择合适的数据类型可以节省内存# 占用内存大 import sys my_list [i for i in range(1000000)] print(sys.getsizeof(my_list)) # 输出内存大小 # 占用内存小 import array my_array array.array(i, range(1000000)) print(sys.getsizeof(my_array)) # 输出内存大小4.2 避免内存泄漏及时释放不再使用的对象# 可能导致内存泄漏 class MyClass: def __init__(self): self.data [i for i in range(1000000)] instances [] for i in range(100): instances.append(MyClass()) # 释放内存 instances None import gc gc.collect()4.3 使用内存分析工具使用memory_profiler分析内存使用情况# 安装memory_profiler # pip install memory_profiler from memory_profiler import profile profile def memory_test(): data [i for i in range(1000000)] result sum(data) return result memory_test()五、并发和并行5.1 使用多线程对于IO密集型任务使用多线程可以提高性能import threading import time def download_file(url): # 模拟下载文件 time.sleep(1) print(fDownloaded {url}) urls [furl{i} for i in range(10)] # 串行执行 start_time time.time() for url in urls: download_file(url) end_time time.time() print(fSerial execution time: {end_time - start_time} seconds) # 并行执行 start_time time.time() threads [] for url in urls: thread threading.Thread(targetdownload_file, args(url,)) threads.append(thread) thread.start() for thread in threads: thread.join() end_time time.time() print(fParallel execution time: {end_time - start_time} seconds)5.2 使用多进程对于CPU密集型任务使用多进程可以提高性能import multiprocessing import time def calculate_sum(start, end): return sum(range(start, end)) # 串行执行 start_time time.time() result1 calculate_sum(0, 50000000) result2 calculate_sum(50000000, 100000000) total result1 result2 end_time time.time() print(fSerial execution time: {end_time - start_time} seconds) print(fTotal: {total}) # 并行执行 start_time time.time() with multiprocessing.Pool(processes2) as pool: results pool.starmap(calculate_sum, [(0, 50000000), (50000000, 100000000)]) total sum(results) end_time time.time() print(fParallel execution time: {end_time - start_time} seconds) print(fTotal: {total})5.3 使用异步IO对于IO密集型任务使用异步IO可以提高性能import asyncio import time async def download_file(url): # 模拟下载文件 await asyncio.sleep(1) print(fDownloaded {url}) async def main(): urls [furl{i} for i in range(10)] tasks [download_file(url) for url in urls] await asyncio.gather(*tasks) start_time time.time() asyncio.run(main()) end_time time.time() print(fAsync execution time: {end_time - start_time} seconds)六、使用C扩展6.1 使用CythonCython可以将Python代码编译为C代码提高执行速度# example.pyx def calculate_sum(int n): cdef int i cdef int result 0 for i in range(n): result i return result # setup.py from setuptools import setup from Cython.Build import cythonize setup( ext_modulescythonize(example.pyx) ) # 编译 # python setup.py build_ext --inplace # 使用 import example print(example.calculate_sum(1000000))6.2 使用NumPyNumPy使用C实现执行速度比纯Python快import numpy as np # 慢 import time start_time time.time() result sum(range(1000000)) end_time time.time() print(fPython sum: {end_time - start_time} seconds) # 快 start_time time.time() result np.sum(np.arange(1000000)) end_time time.time() print(fNumPy sum: {end_time - start_time} seconds)七、Python与Rust的对比作为一个同时学习Python和Rust的转码者我发现对比学习是一种很好的方法7.1 性能对比Python开发效率高但性能相对较低Rust性能优异但开发效率相对较低适用场景Python适合快速开发Rust适合性能要求高的场景7.2 学习心得Python的优势开发效率高生态丰富Rust的优势性能优异内存安全相互借鉴从Python学习快速开发从Rust学习性能优化八、实践项目推荐8.1 性能优化项目大型数据集处理优化大型数据集的处理速度计算密集型任务优化计算密集型任务的执行速度内存优化优化内存使用减少内存泄漏并发处理使用并发和并行提高处理速度九、学习方法和技巧9.1 学习方法循序渐进先学习基础优化方法再学习高级优化技巧项目实践通过实际项目来巩固知识文档阅读仔细阅读性能优化相关的文档社区交流加入社区向他人学习9.2 常见问题和解决方法性能瓶颈使用性能分析工具定位性能瓶颈内存占用高使用内存分析工具分析内存使用情况并发问题注意线程安全和进程间通信过度优化避免过早优化先确保代码正确性十、总结Python性能优化是一个持续的过程需要我们不断地学习和实践。作为一个非科班转码者我深刻体会到性能优化的重要性。我的学习过程并不是一帆风顺的遇到了很多困难和挫折但通过不断地实践和学习我逐渐掌握了Python性能优化的各种技巧。保持学习保持输出。虽然现在我还是个菜鸡但我相信只要坚持总有一天能成为真正的「第一程序员」

更多文章