▌ 技术引导
Python性能优化面试准备不是背概念,是讲你踩过哪些坑,怎么解决的,怎么用工具定位问题,怎么在实际项目中落地。面试官问的不是你懂多少,而是你用过什么,做过什么,解决过什么。比如你用过cProfile定位函数调用,用过PyPy跑基准,用过numba加速计算密集型代码,用过multiprocessing替代threading,这些都要说得具体。如果你没用过这些,就说你用过类似的工具,比如用过asyncio优化I/O,用过Redis缓存减少数据库查询,用过lru_cache做函数记忆。记住,真实实战经验远比理论强,面试官最在意你有没有实际解决问题的能力,而非性能调优的书本知识。所以,重点是讲你踩过哪些坑,怎么优化的,结果如何,这才是面试官要的答案。
▌ 技术参考
一 做性能优化你得知道Python的GIL是个大坑,它限制了多线程并行执行的能力。别用threading做计算密集型任务,改用multiprocessing。我之前在做数据处理的时候,用threading处理了5000个任务,结果发现CPU利用率始终在40%左右。后来换成multiprocessing,CPU利用率直接飙到90%以上。启动的时候用concurrent.futures.ProcessPoolExecutor,传参的时候注意序列化方式,比如用pickle还是dill,根据你的数据结构选。如果你用的是numpy数组,用multiprocessing的共享内存方式反而更高效。
二 你得知道cProfile是比time模块更靠谱的性能分析工具。它能显示每个函数的调用次数、执行时间、耗时比例。我之前写过一个爬虫程序,跑起来慢得离谱,用time模块看不出来具体瓶颈,但cProfile显示90%时间都在一个解析函数里。这时候你就要优化这个函数,比如用正则表达式替换字符串处理,或者用cython改写。cProfile的使用很简单,就是import cProfile,然后profile.Profile().runctx("你的代码"),或者用命令行直接运行:python -m cProfile your_script.py。别忘了加统计结果的输出格式,比如用--sort=time排序,这样更直观。
三 内存使用是优化的另一个关键点,尤其是处理大数据的时候。Python的垃圾回收机制有时候会拖慢性能,特别是全栈应用。建议你用tracemalloc来追踪内存分配,并结合guppy或者objgraph定位内存泄漏。我之前开发一个日志分析系统,运行两天后内存暴涨,用tracemalloc发现是某些对象没有及时释放,后来加上弱引用或手动管理生命周期就解决了。如果数据量太大,可以考虑用内存映射文件或者使用数据库分页读取。别想着把所有数据都加载到内存,这会吃掉你的内存,导致OOM。
四 在处理计算密集型任务时,numba是个救命稻草。我之前写过一个图像处理模块,每张图片处理要300ms,用numba编译后直接降到60ms。numba的使用简单,只需要在函数前加@jit装饰器,然后指定目标架构,比如target='cpu'或者target='cuda'。注意类型声明,如果你不声明类型,numba会自动推断,但性能不如显式声明。比如,用@jit(nopython=True)能获得更高加速,但需要你严格按类型写。如果你用的是numpy数组,用nopython模式会更高效。
五 用异步I/O优化网络请求的场景很常见,比如爬虫或者API调用。asyncio和aiohttp是很好的组合,但要注意别把异步写成单线程。我之前用asyncio处理1000个请求,结果发现单线程根本不够,后来换成asyncio.gather并发执行,性能提升了3倍。配置的时候记得用loop = asyncio.get_event_loop(),然后在main函数里运行await asyncio.run(main())。如果遇到I/O堵塞,可以用asyncio.wait_for设置超时,避免程序卡死。别总幻想用异步解决所有问题,有些计算密集型任务还是得用多进程。
六 缓存是优化的一种策略,但得用对。像lru_cache这种装饰器用得多了会吃内存,特别是数据量大时。我之前用过lru_cache优化递归函数,结果内存爆掉,后来换成functools.lru_cache(maxsize=128, typed=False)才控制住。typed=False允许不同类型参数的缓存合并,减少内存占用。如果是数据库查询,可以考虑用Redis做缓存,设置合理的TTL。还有像memoize这种第三方库,也可以用来做函数缓存,但记得用它前先测试是否真的能减少重复计算。
七 使用C扩展是性能优化的终极手段,但门槛高。比如用cython写关键模块,或者用ctypes调用C代码。我之前优化一个图像处理库,用cython把核心循环转成C代码,性能提升了15倍。cython的安装很简单,只需要pip install cython,然后写个.pyx文件,用setup.py编译成.so或者.dll。另外,你也可以用C语言写的库,比如用numpy的C底层实现替代Python的循环。但要小心,编译过程容易出错,特别是跨平台时。记得用--inplace参数编译,这样不会产生多余文件。
八 在处理大数据时, pandas的性能优化很有讲究。比如使用dtype指定列类型,避免自动推断;用category类型替代object类型;用数值类型代替float64。我之前用pandas处理上亿行数据,内存占用高得离谱,后来改成int32和float32,内存直接减少一半。还有,用dask处理数据时,可以分块读取,利用并行计算能力。如果数据量太大,用sqlite或者parquet格式存储,比csv更高效。记得在读取数据时用chunksize参数,避免一次性加载内存。
九 网络请求优化可以用Requests和httpx来对比。Requests是同步的,而httpx是异步的,性能有差距。比如用httpx发起1000个请求,平均响应时间比Requests快40%。但要用好httpx,得配合asyncio写协程,否则和Requests一样慢。配置的时候可以加httpx.Client(limit=100),限制并发连接数。还有,如果需要支持HTTPS,记得配置SSL验证方式,比如用httpx.Client(verify=False)来跳过证书检查,但别在生产环境用。
十 对于数据库性能,你得知道索引和查询优化是关键。比如在PostgreSQL里,用EXPLAIN分析查询计划,发现缺少索引或者全表扫描。我之前优化一个查询,发现没有索引,加了索引后执行时间从3秒降到0.3秒。另外,数据库连接池很重要,比如用SQLAlchemy的create_engine,加上pool_size和max_overflow参数,防止频繁连接。如果用MySQL,记得在连接时配置use_unicode=True和charset=utf8mb4,避免乱码和性能损耗。
十一 在处理大量文件时,你得考虑用异步IO或者并行处理。比如用aiofiles库异步读写文件,或者用concurrent.futures.ThreadPoolExecutor并发处理。我之前用多线程处理1000个文件,结果发现线程数太多反而拖慢,后来限制到50个线程,性能提升明显。另外,文件读取的时候用with open()确保关闭,避免文件句柄泄漏。如果文件很大,分块读取更高效,比如用read(1024)代替read()。
十二 管理依赖库的版本也很重要,特别是那些经常触发GC的库。比如用gRPC替代requests,或者用uvicorn替代fastapi,性能提升明显。还有,别用太多第三方库,比如在小项目里用fastapi替代flask,虽然功能相似,但性能差异大。配置gunicorn时,用worker_class='uvicorn.workers.UvicornWorker',设置worker数量为CPU核心数,而不是2倍。记得用--preload参数预加载模块,减少启动时间。
十三 在部署时,考虑用PyPy代替CPython。PyPy在执行Python代码时,用JIT编译能带来显著的性能提升,尤其在循环和计算密集型任务里。我之前跑一个Python服务,用CPython要10秒启动,换成PyPy后直接变成5秒。但要注意,PyPy对某些库支持不好,比如有些C扩展的库可能无法运行。部署的时候用pyenv切换版本,用docker镜像确保环境一致。记得在dockerfile里指定使用PyPy镜像,比如FROM pypy:3.11。
十四 做性能优化的时候,别忘了用负载测试工具验证效果。比如用Locust模拟高并发请求,用py-spy查看运行时调用栈。我之前优化一个API接口,用Locust测完发现并发性能提升了3倍,但用py-spy看到某些函数依然在阻塞。这时候就要针对性优化。测试的时候要模拟真实场景,比如用不同的请求头、参数和数据量。使用docker部署测试环境,避免影响生产数据。
十五 文本处理时,用正则表达式雷区要注意,比如用re.findall和re.match区别很大。我之前写了一个爬虫,用re.findall抓取数据,结果每次都要重新编译正则表达式,导致性能下降。后来用re.compile预编译,再用search方法,性能提升了两倍。还有,别用字符串拼接,改用join方法。在处理大量文本时,用生成器或者迭代器会更节省内存。如果数据结构复杂,可以用PyParsing或者regex模块替代。
十六 如果代码里有大量循环,可以考虑用列表推导式或者map函数替代。我之前用for循环处理一个列表,结果发现循环内部有多个条件判断,换成列表推导式后,执行时间从5秒降到1秒。但要注意,有时候列表推导式反而更难维护,得看具体场景。比如在处理对象的时候,用生成器更合适。此外,用numpy的向量化操作比Python循环快得多,特别是处理二维数组时。
十七 用profiling工具分析代码时,别只看一行代码的耗时,要关注整体调用链。比如用py-spy生成火焰图,能看到哪些函数调用次数多,哪些耗时最长。我之前用py-spy分析一个服务,发现某个JSON解析函数占用了80%时间,后来换成ujson后,性能提升了30%。火焰图的生成命令是py-spy record -o profile.svg --cpu -p 1234,其中1234是进程ID。记得用--freq参数调整采样频率,太高会占用CPU,太低则不够精确。
十八 在写代码时,避免频繁的全局变量访问。全局变量访问比局部变量慢很多,尤其是在循环里。我之前写了一个统计模块,循环里频繁访问全局变量,结果性能差了很多。后来改成类属性或者局部变量,执行时间直接下降。另外,避免用eval或者exec,这些函数会引入安全风险,性能也差。用ast.literal_eval替代更安全,而且效率更高。
十九 用内存优化工具时,比如用mmap实现内存映射,能减少内存占用。我之前处理一个大型日志文件,用mmap直接读取,内存占用从2GB降到几百MB。但要注意,mmap在Windows上支持不好,建议用Linux环境。还有,用mmapped文件的时候,记得设置正确的权限,避免读写错误。
二十 在处理多任务时,别用线程池,改用进程池。线程池受限于GIL,而进程池可以充分利用多核CPU。我之前一个任务处理程序,用线程池排了100个任务,结果CPU利用率只有50%。换进程池后,CPU利用率直接升到90%。配置的时候用concurrent.futures.ProcessPoolExecutor,注意参数传递方式,比如用multiprocessing.Manager创建共享对象。别忘了设置max_workers参数,根据CPU核心数调整。
二十一 用缓存的时候,别用内存缓存,改用持久化缓存。比如用redis或者memcached,避免程序重启后数据丢失。我之前一个缓存系统用内存,结果重启后缓存全丢,后来换成redis,性能提升不说,稳定性也提高了。配置的时候注意设置TTL,避免缓存堆积。如果数据量很大,用分片策略提高并发能力。
二十二 在数据库连接中,别用每个请求都新建连接,改用连接池。比如用SQLAlchemy的create_engine,配置pool_size和max_overflow,防止连接数爆掉。我之前用Flask写API,没用连接池,结果在高并发下频繁报错。后来加上连接池后,错误率大大降低。此外,设置连接池的回收机制,比如pool_recycle,避免连接长时间空闲导致超时。
二十三 优化性能的时候,别只看执行时间,还要看内存使用和资源占用。比如用pympler分析对象内存占用,用psutil监控CPU和内存。我之前优化一个爬虫程序,发现内存使用是瓶颈,后来用更高效的字典结构和对象池,内存占用下降明显。这在部署到生产环境时尤为重要,避免OOM导致服务崩溃。
二十四 用异步框架时,别用默认配置,改用更高效的回执方式。比如用FastAPI配合Uvicorn,而不是Gunicorn。我之前用Gunicorn部署FastAPI,发现响应时间都快200ms,换Uvicorn后直接降到50ms。配置的时候用--workers 4 --timeout 60,同时设置--preload,这样可以提高启动效率。
二十五 如果你是做数据科学,用numba和numpy的结合能大幅提升计算速度。我之前用纯Python做矩阵计算,执行时间超过10秒,换成numba后,直接降到2秒。配置的时候用@numba.jit装饰器,设置nopython=True,避免Python解释器的干涉。同时注意类型转换,确保数据结构是numba支持的类型。
Python性能优化怎么面试准备?面试高频
Python性能优化面试准备不是背概念,是讲你踩过哪些坑,怎么解决的,怎么用工具定位问题,怎么在实际项目中落地。面试官问的不是你懂多少,而是你用过什么,做过什么,解决过什么。比如你用过cProfile定位函数调用,用过PyPy跑基准,用过numba加速计算密集型代码,用过multiprocessing替代threading,这些都要说得具
语言深潜AI4 次阅读
Related
延伸阅读

OpenAI官方 | Codex定价成本优化 | 文档不再手写Codex智能 · 2026-07-10

DeepSeek V4源码解析:趋势预判 | 未来五年预判大模型资讯 · 2026-07-10

新手必看:Cassandra性能优化实战 | 9分钟学会数据库 · 2026-07-10

缓存设计:DynamoDB,建议收藏数据库 · 2026-07-10

新手必看:自然语言编程工作流搭建 | 5分钟学会AI工具实战 · 2026-07-14

建议收藏:VS Code Cursor 性能优化 | 老用户总结VS Code指南 · 2026-07-10