基于Python的系统性能优化经验总结

基于Python的系统性能优化经验总结

性能优化这个话题很大,这里只分享一些自己浅薄的性能优化经验,希望能抛砖引玉,欢迎大家交流分享。

1. 代码写法上优化

python作为一个翻译型语言,经常能发现,同样的功能换个写法就有几十上百倍的提升,以下列出几种常见的

1.1 使用推导式(Comprehension)

举个例子加以说明

scale = int(1e7)
# 不用推导式
s = time.time_ns()
res = []
for i in range(scale):
    res.append(i * i)
print(time.time_ns() - s)  # 922763000 单位ns

# 推导式
s = time.time_ns()
res = [i * i for i in range(scale)]
print(time.time_ns() - s)  # 802135800 单位ns

可见推导式显著要比普通写法快

1.2 用变量代替属性

当一个实例属性被反复引用时最好使用临时变量将属性值取出再使用临时变量,因为实例getattr会引入额外耗时。
举例说明:

scale = int(1e7)
a = A()
s = time.time_ns()
for i in range(scale):
    x = a.echo + 1
print(time.time_ns() - s)  # 451374400 单位ns

s = time.time_ns()
e = a.echo
for i in range(scale):
    x = e + 1
print(time.time_ns() - s)  # 336747000 单位ns

1.3 能inplace就不copy

例如Dataframe一般inplace操作比copy一份再操作要快

1.4 善用copy

对于一些数据结构,当我们想要一个一样的实例的时候,有些时候copy要比重新初始化一个要更快

1.5 向量化思维

处理数据时需要习惯思考如何向量化的操作,而不是一味地用forloop解决问题。
举例:对一列数据df判断是否严格递增,df[1:, x] > df[0:n-1, x]即可,核心思想是错位比较。

1.6 lazy化思维

lazy化可以让用户真正想要结果时才把所有操作一次性实现,而中间过程只需要用数据结构记录需要的操作即可。

等等等

还有很多细节,不一一列举

2. 算法上优化

核心指标:时间复杂度,而且要合理利用空间换时间

3. 从需求入手,精简逻辑

往往功能越单一的代码运行起来越快,因此做需求的时候充分理解需求,限制上下游的输入输出,能够帮我们简化代码逻辑(不必要的功能、输入兼容等)。而且限定了场景,更能方便技术人员做专门的优化。

4. 对性能极限有概念

对常见场景的性能极限有量级概念会帮助我们在优化时量化我们程序性能表现,知道还有多大的优化空间。下面以python的一些基础操作为例。
注:测试环境

4.1 加减乘除

单次大概在30-40ns
验证:
在这里插入图片描述
结果:
在这里插入图片描述

4.2 列表求和

python原生列表百万量级求和在ms级别,numpy大概在百微秒级别。可以看到numpy比原生列表操作要快很多。
在这里插入图片描述
在这里插入图片描述

4.3 字典搜索

python字典搜索大概在百纳秒级别
在这里插入图片描述
在这里插入图片描述

待补充

5. 优化缓存策略

5.1缓存位置

将请求数据缓存下来便于下次请求时加速响应是一个很正常的思想。在常见的系统模型中请求链路:

客户端 - (中台)- 后台服务 - 数据存储

显而易见,缓存位置越靠前,命中缓存时响应速度越快

不过缓存是一把双刃剑,例举缓存带来的几个问题:
a. 对于有一定时效性需求的数据,如何更新缓存
b. 缓存不能无限制增长,如何设置淘汰策略
c. 对于分布式系统,如何保证数据的一致性
可见缓存会引入维护成本,且缓存位置越靠前,维护成本越高,出错的可能性也越高

因此需要根据业务场景合理设置缓存策略,比如客户端只访问历史数据且一个批次请求有一定规律,则可以考虑在客户端缓存。

5.2 缓存内容

缓存的内容并不一定是最终返回的结果,也可以是一个批次的整个数据集,也可以是一些中间结果。
举个例子:

我有对一个数据集有十万个请求,每次请求可能是不同行的不同列。
如果只缓存每个请求的最终结果可能会导致缓存命中率低,而大大增加io次数。
那我可以把整个数据集全部缓存,或者如果请求有一定范围规律可以部分数据块缓存,这样能显著降低io次数,且如果处理得当,在内存中搜索也会更快。

6. 更换技术选型

技术选型topic比较大且对已有系统的冲击也比较大,所以放在最后。虽说在项目开始开发之前就应该做好技术选型,但是毕竟技术在不断发展,会不断有新的性能更好的技术出现,因此更换技术选型也是需要考虑的可能性之一,同时这也敦促我们开发人员要保持学习。

总结

系统性能优化是一个很复杂的问题,不仅需要我们能够深入每个系统节点,还需要我们具备一定的全局视角,优化过程中也需要一定的专业知识和经验做支撑,相应地这个过程也会带给我们很多的学习思考,是很好的技术成长机会。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于Python的图书推荐系统任务书: 一、项目背景: 随着互联网的快速发展,人们获取图书资源的方式发生了巨大的变化,传统的图书推荐方式已经无法满足用户的需求。为了提高图书推荐的准确性和个性化程度,我们决定开发基于Python的图书推荐系统。 二、项目目标: 1. 开发一个基于Python的图书推荐系统,能够根据用户的阅读历史和喜好,为用户推荐符合其兴趣的图书。 2. 通过分析用户的阅读习惯和行为,提供个性化的图书推荐,提高用户的阅读体验。 3. 实现系统的实时推荐功能,能够根据用户当前的需求和情况,及时推荐相关图书。 三、项目内容: 1. 数据采集与存储:利用Python编写爬虫程序,从图书网站或者其他数据源获取图书相关的信息,存储到数据库中。 2. 数据处理与分析:利用Python进行数据清洗和处理,将采集到的图书信息转化为可用的数据结构,并进行特征提取和数据分析。 3. 推荐算法设计:根据用户的阅读历史和喜好,设计推荐算法,包括基于内容的推荐和协同过滤推荐算法。 4. 用户接口设计:设计用户界面,提供用户注册、登录和个人信息管理的功能,并实现图书的展示和推荐功能。 5. 系统测试与优化:对系统进行全面测试,检查系统的性能和稳定性,并根据用户的反馈进行优化和改进。 四、项目计划: 1. 项目启动阶段:确定项目目标和需求,研究相关技术和算法,制定项目计划和任务分工。 2. 数据采集与存储阶段:编写爬虫程序,采集图书信息并存储到数据库中。 3. 数据处理与分析阶段:对采集到的数据进行清洗和处理,进行特征提取和数据分析。 4. 推荐算法设计阶段:根据数据分析结果,设计推荐算法,并实现算法模型。 5. 用户接口设计阶段:设计用户界面,实现图书展示和推荐功能。 6. 系统测试与优化阶段:进行系统测试,收集用户反馈并进行系统的优化和改进。 7. 项目完成阶段:提交项目报告和演示,总结项目经验和不足,并提出后续改进的建议。 五、项目成果: 1. 基于Python的图书推荐系统软件,并提供用户界面和推荐功能。 2. 项目报告和演示材料,包括系统功能介绍、技术实现和性能评估。 3. 项目经验总结和后续改进的建议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin9436

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值