当前位置:首页 > 技术文章 > 正文内容

python中20个核心性能优化技巧,不允许你还不知道

zonemu2个月前 (08-12)技术文章26

在Python中,性能优化需要结合语言特性和算法思维。以下是经过工业级验证的 20个核心性能优化技巧,涵盖从微观代码优化到宏观架构设计:

一、基础优化策略

1.选择高效数据结构

# 查找操作对比(100万数据)
lst = list(range(1_000_000))
s = set(lst)

%timeit 999999 in lst  # 线性查找:~25ms
%timeit 999999 in s    # 哈希查找:~0.0001ms(快25万倍)

2.局部变量加速

def slow():
    global_var = [i for i in range(10_000)]
    return len(global_var)  # 每次访问全局变量

def fast():
    local_var = [i for i in range(10_000)]
    return len(local_var)  # 访问局部变量快15%

%timeit slow()  # 152 μs
%timeit fast()  # 130 μs

3.字符串拼接优化

# 错误方式(每次拼接创建新对象)
s = ""
for i in range(10000):
    s += str(i)  # O(n^2)时间复杂度

# 正确方式(join一次性分配内存)
parts = []
for i in range(10000):
    parts.append(str(i))
s = "".join(parts)  # 快50倍

二、循环与计算优化

4.向量化计算(NumPy)

import numpy as np

# 传统循环(慢)
def sum_python(n):
    return sum(i*i for i in range(n))

# NumPy向量化(快100倍)
def sum_numpy(n):
    return np.arange(n).sum() ** 2

%timeit sum_python(1_000_000)  # 120ms
%timeit sum_numpy(1_000_000)   # 1.2ms

5.避免重复计算

# 优化前
for i in range(len(data)):
    result = expensive_calc(data[i]) * scale_factor  # 每次计算scale_factor

# 优化后
scaled_factor = expensive_calc(scale_factor)  # 预先计算
for i in range(len(data)):
    result = data[i] * scaled_factor

6.生成器替代列表

# 内存消耗对比
def get_numbers_list(n):
    return [i for i in range(n)]  # 消耗O(n)内存

def get_numbers_gen(n):
    yield from range(n)  # 消耗O(1)内存

# 处理1GB数据时,生成器可避免内存溢出

三、高级优化技术

7.JIT编译(Numba)

from numba import jit

@jit(nopython=True)
def monte_carlo_pi(n):
    count = 0
    for _ in range(n):
        x, y = np.random.random(), np.random.random()
        if x**2 + y**2 < 1:
            count += 1
    return 4 * count / n  # 比纯Python快200倍

8.内存视图(memoryview)

data = bytearray(b'x' * 100_000_000)
view = memoryview(data)  # 零拷贝操作
processed = view[10_000:20_000]  # 不复制底层数据

9.多进程并行(multiprocessing)

from multiprocessing import Pool

def process_chunk(chunk):
    return sum(x*x for x in chunk)

with Pool(4) as p:
    results = p.map(process_chunk, [data[i::4] for i in range(4)])  # 4核并行

四、I/O性能优化

10.批量文件操作

# 错误方式(多次I/O)
with open('data.txt', 'w') as f:
    for item in data:
        f.write(str(item) + '\n')  # 每次write有系统调用开销

# 正确方式(单次I/O)
content = '\n'.join(map(str, data))
with open('data.txt', 'w') as f:
    f.write(content)  # 减少系统调用

11.压缩传输数据

import zlib
data = b'x' * 100_000_000
compressed = zlib.compress(data)  # 体积缩小10倍

五、工具链优化

12.使用PyPy解释器

# 对计算密集型代码可提升3-10倍速度
pypy3 your_script.py

13.Cython混合编程

# cython_test.pyx
def cython_sum(int n):
    cdef long total = 0
    cdef int i
    for i in range(n):
        total += i
    return total  # 编译后比纯Python快50倍

14.性能分析工具

# 使用py-spy进行采样分析
pip install py-spy
py-spy top --pid <PID>  # 实时查看CPU热点

六、架构级优化

15.缓存计算结果

from functools import lru_cache

@lru_cache(maxsize=1024)
def expensive_call(param):
    return heavy_computation(param)  # 相同参数直接返回缓存

16.异步I/O(asyncio)


import aiohttp
import asyncio

async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()  # 非阻塞I/O

# 并发处理100个请求比同步快10倍

七、优化效果对比

场景

优化前

优化后

提升倍数

1亿次循环求和

12秒

0.3秒(NumPy)

40倍

字典查找 vs 列表查找

O(n)

O(1)

百万倍

字符串拼接(1万次)

450ms

9ms

50倍

计算密集型函数

10秒

0.5秒(Numba)

20倍


终极优化原则

  1. 先测量后优化:用cProfile定位真正瓶颈
  2. 二八法则:20%的代码消耗80%性能
  3. 空间换时间:合理使用缓存和预处理
  4. 避免过度优化:保持代码可读性

记住

"过早优化是万恶之源" —— Donald Knuth
但正确的优化能让程序从"不可用"变为"高效"!

相关文章

智能停车场管理系统五种收费类型设置

智能停车场管理系统五种收费类型设置  点击智能停车场管理系统收费标准设置图标,出现下图所示对话框,在这个界面里面可以对停车场系统需要使用的收费标准进行个性化设置:共有五种收费类型(标准收费类、通用标准...

GitLab-合并请求(gitlab合并请求合并者还原图解)

描述合并请求可用于在您对项目进行的其他人员之间交换代码,并轻松与他们讨论更改。合并请求的步骤步骤1-在创建新的合并请求之前,GitLab中应该有一个创建的分支。您可以参考本章来创建分支-步骤2-登录到...

Jenkins 学习笔记(jenkins要学多久)

本学习笔记参考《Jenkins 2.x实践指南》。1. Jenkins 简介#Jenkins 是一款自动化的任务执行工具。通常用于持续集成/持续交付领域。可以通过界面或Jenkinsfile告诉Jen...

html5你能把太阳系动态做出来,但是你能把月亮也做出来吗?

需要源码请评论后加前端学习群470593776课题:HTML5加原生js打造一个炫酷动态的太阳系简介:首先对于太阳系各大星球的运转关系,速度等资料,不然弄出来也是被喷的下场, 还有对于逻辑思维,算法的...

在html5页面中如何使用vue3(html页面引入vue组件)

今天是2021.7.14,是个好日子.好久没发布文章了.今天发布下如何在在html页面中使用vue3.义县游学电子科技一直以技术文章为主.以下是h5的页面源码:<html><scri...

详解HTML5培训课程行业标准(html5课程总结)

需要HTML5培训必须先了解HTML5前景,没前景的职业,我们绝对不去入坑,这是正常人的思维。因此学习HTML5还的要多了解一些,目前HTML5技术已经日趋成熟,从国内热潮来看很多企业已开始使用,所以...