广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python性能提升的方法有哪些
  • 924
分享到

Python性能提升的方法有哪些

2023-06-16 15:06:15 924人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容介绍了“python性能提升的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!时序分析优化之前,首先要找到是哪部分代码拖慢了

本篇内容介绍了“python性能提升的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

时序分析

优化之前,首先要找到是哪部分代码拖慢了整个程序的运行。有时候程序的"瓶颈"不是很明显,如果找不到,以下是一些建议以供参考:

注意:这是一个计算e的x次幂的演示程序(出自Python文档):

# slow_program.py  from decimal import*  defexp(x):      getcontext().prec +=2      i, lasts, s, fact, num =0, 0, 1, 1, 1      while s != lasts:          lasts = s          i +=1          fact *= i          num *= x          s += num / fact      getcontext().prec -=2      return+s  exp(Decimal(150))  exp(Decimal(400))  exp(Decimal(3000))

GitHub上查看rawslow_program.py全部代码

最省力的“性能分析”

首先,最简单且最省力的解决方案是使用Unix的time命令: 

~ $ time python3.8  slow_program.py  real     0m11,058s  user     0m11,050s  sys      0m0,008s

gitHub上查看rawbase_time.shell全部代码

如果只是给整个程序计时,它很有用,但还不足够……

最详细的性能分析

性能分析的另一方法是cProfile,从中能得到很大的信息量:

~ $ python3.8 -m  cProfile -s time slow_program.py           1297 function calls (1272 primitive  calls) in 11.081 seconds     Ordered by: internal time     ncalls   tottime  percall  cumtime   percall filename:lineno(function)          3    11.079    3.693   11.079     3.693 slow_program.py:4(exp)          1     0.000    0.000    0.002     0.002 {built-in method _imp.create_dynamic}        4/1     0.000    0.000   11.081    11.081 {built-in method builtins.exec}          6     0.000    0.000    0.000     0.000 {built-in method __new__ of type object at 0x9d12c0}          6     0.000    0.000    0.000     0.000 abc.py:132(__new__)         23     0.000    0.000    0.000     0.000 _weakrefset.py:36(__init__)        245     0.000    0.000    0.000     0.000 {built-in method builtins.getattr}          2     0.000    0.000    0.000     0.000 {built-in method marshal.loads}         10     0.000    0.000    0.000     0.000 <frozen importlib._bootstrap_external>:1233(find_spec)        8/4     0.000    0.000    0.000     0.000 abc.py:196(__subclasscheck__)         15     0.000    0.000    0.000     0.000 {built-in method posix.stat}          6     0.000    0.000    0.000     0.000 {built-in method builtins.__build_class__}          1     0.000    0.000    0.000     0.000 __init__.py:357(namedtuple)         48     0.000    0.000    0.000     0.000 <frozen importlib._bootstrap_external>:57(_path_join)         48     0.000    0.000    0.000     0.000 <frozen importlib._bootstrap_external>:59(<listcomp>)          1     0.000    0.000   11.081    11.081 slow_program.py:1(<module>)  ...

在GitHub上查看rawcprofile.shell全部代码

这里用cProfile模块和time参数运行测试脚本,以便按内部时间(cumtime)对行进行排序。从中可以得到很多信息,以上所列结果约为实际输出的10%。由此可见,exp函数就是拖慢程序的“罪魁祸首”(太神奇啦!),现在看看更详尽的时序和性能分析......

对特定函数计时

已经知道拖慢程序运行的函数,下一步可使用简单的修饰器,专门对该函数计时,不测量其余代码。如下所示:

deftimeit_wrapper(func):      @wraps(func)      defwrapper(*args, **kwargs):          start =  time.perf_counter()  # Alternatively, you  can use time.process_time()          funcfunc_return_val = func(*args, **kwargs)          end = time.perf_counter()          print( {0:<10}.{1:<8} : {2:<8} .fORMat(func.__module__, func.__name__, end - start))          return func_return_val      return wrapper

在GitHub上查看rawtimeit_decorator.py全部代码

该修饰器可以应用于功能测试,如下所示:

@timeit_wrapper  defexp(x):      ...  print( {0:<10}{1:<8}{2:^8} .format( module ,  function ,  time ))  exp(Decimal(150))  exp(Decimal(400))  exp(Decimal(3000))

在GitHub上查看rawtimeit_decorator_usage.py全部代码

输出如下: 

~ $ python3.8  slow_program.py  module     function   time     __main__  .exp       :0.003267502994276583  __main__  .exp       :0.038535295985639095  __main__  .exp       : 11.728486061969306

在GitHub上查看rawrun_with_timeit_decorator.shell全部代码

要考虑的一个问题是实际/想要测量的时间类型是什么。Time程序包提供了time.perf_counter和time.process_time。两者的区别是:perf_counter返回绝对值,其中包括Python程序进程未运行时的时间,因此可能会受计算机负载的影响;而process_time仅返回用户时间(不包括系统时间),这仅是程序的运行时间。

加快程序运行速度这是全文有趣的部分,关于如何加快Python的程序运行速度。我并没有列出一些可以奇妙解决性能问题的小技巧或代码段,而是涉及一般性的构想和策略,它们能极大地提高性能,某些情况下甚至能将性能提高30%。

使用内置数据类型

显而易见,内置数据类型运行很快,尤其是与自定义类型(例如树或链表)相比。主要是因为内置程序是用C语言实现的,远超过用Python编码的运行速度。

使用lru_cache缓存/记忆 

我已经在上一篇博文中讲过这块内容,但在此还是要用简单的示例说明:

import functools  import time  # caching up to 12  different results  @functools.lru_cache(maxsize=12)  defslow_func(x):      time.sleep(2)  # Simulate long computation      return x  slow_func(1)  # ... waiting for 2 sec before getting  result  slow_func(1)  # already cached - result returned  instantaneously!  slow_func(3)  # ... waiting for 2 sec before getting  result

在GitHub上查看rawlru_cache.py全部代码

以上函数使用time.sleep模拟大量运算。第一次使用参数1调用该函数时,返回结果需要2秒。再次调用时,结果已被缓存,因此会跳过函数主体并立即返回结果。更多内容请参见此处。

使用局部变量

这与在每个作用域中查找变量的速度有关。我用了“每个作用域”这个字眼,因为它不仅仅是“使用局部变量还是全局变量”的问题。实际上,即使在函数的局部变量(最快)、类级属性(如self.name-较慢)和全局变量(如导入的函数,time.time-最慢)之间,查找速度也有所不同。

可以通过运行无用的任务来提高性能,如下所示:

#  Example #1  classFastClass:      defdo_stuff(self):          temp =self.value  # this speeds up lookup in loop          for i inrange(10000):              ...  # Do something with `temp` here  #  Example #2  import random  deffast_function():      r = random.random      for i inrange(10000):          print(r())  # calling `r()` here, is faster than  global random.random()

在GitHub上查看rawlocal_vars.py全部代码

使用函数(Function)

这怎么和假想的不同?理论上调用函数不是会将更多的东西放到堆栈上,加大返回结果的负担吗?但实际上,使用函数确实能加快运行速度,这与前一点有关。将整个代码放在一个文件中而非函数中,它是全局变量而非局部变量,运行速度就会慢得多。因此,可以将整个代码包裹在main函数中并通过一次调用来加速代码,如下所示:

defmain():      ...  # All your previously global code  main()

在GitHub上查看rawglobal_vars.py全部代码

避免访问属性(Attribute)

可能拖慢程序的一个原因是使用点运算符(.)访问对象属性。该运算符通过使用__getattribute__方法触发了字典查找,使代码产生额外负担。那么,如何避免或减少属性访问? 

#  Slow:  import re  defslow_func():      for i inrange(10000):          re.findall(regex, line)  # Slow!  #  Fast:  from re import findall  deffast_func():      for i inrange(10000):          findall(regex, line)  # Faster!

在GitHub上查看rawimports.py全部代码

当心使用字符串

在循环里使用格式符(%s)或.format()时,字符串操作可能会变得非常慢。有没有更好的选择?Raymond Hettinger在最近发布的推文中提到:唯一应该使用的是f-string(格式化字符串常量),它是最易读、最简洁且最快捷的方法。根据这篇推文,下面列出了可用的方法(由快到慢):

f {s}{t}   # Fast!  s +    + t     .join((s, t))   %s %s % (s, t)   {} {} .format(s, t)  Template( $s $t ).substitute(ss=s, tt=t)  # Slow!

在GitHub上查看rawstrings.py全部代码

本质上,生成器并没有变得更快,因为它在设计上允许延迟计算以节省内存而非节约时间。然而节省的内存也可以加快程序实际运行速度。怎么做?如果有一个很大的数据集且不使用生成器(迭代器),那么数据可能会溢出CPU的L1 cache(1级缓存),这将大大减慢内存的查找速度。

在性能方面,极重要的一点是:CPU可以将正在处理的所有数据尽可能地保存在缓存中。

“Python性能提升的方法有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Python性能提升的方法有哪些

本文链接: https://www.lsjlt.com/news/284206.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python性能提升的方法有哪些
    本篇内容介绍了“Python性能提升的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!时序分析优化之前,首先要找到是哪部分代码拖慢了...
    99+
    2023-06-16
  • 提升MySQL性能的方法有哪些
    这篇文章主要介绍“提升MySQL性能的方法有哪些”,在日常操作中,相信很多人在提升MySQL性能的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”提升MySQL性能的...
    99+
    2022-10-18
  • 排序算法的性能提升方法有哪些
    本篇内容介绍了“排序算法的性能提升方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!冒泡排序这是最简...
    99+
    2022-10-19
  • 提升 ASP.NET Web API 性能的方法具体都有哪些
    这期内容当中小编将会给大家带来有关提升 ASP.NET Web API 性能的方法具体都有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。ASP.NET Web API 是非常棒的技术。编写 Web A...
    99+
    2023-06-17
  • 提升Python运行性能的习惯有哪些
    本篇内容主要讲解“提升Python运行性能的习惯有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“提升Python运行性能的习惯有哪些”吧!1、使用局部变量使用局部变量替换模块名字空间中的变量...
    99+
    2023-06-02
  • 提升Python程序性能的习惯有哪些
    本篇内容介绍了“提升Python程序性能的习惯有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、使用局部变量尽量使用局部变量代替全局变...
    99+
    2023-07-06
  • python 性能提升的几种方法
    关于python 性能提升的一些方案。 一、函数调用优化(空间跨度,避免访问内存) 程序的优化核心点在于尽量减少操作跨度,包括代码执行时间上的跨度以及内存中空间跨度。 1.大数据求和,使用sum a...
    99+
    2022-06-04
    几种方法 性能 python
  • Python工作效率提升的方法有哪些
    本篇内容主要讲解“Python工作效率提升的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python工作效率提升的方法有哪些”吧!运行外部文件尝试在JupyterNotebook中运...
    99+
    2023-06-16
  • 提高mysql性能的方法有哪些
    本篇内容主要讲解“提高mysql性能的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“提高mysql性能的方法有哪些”吧!一、问题的提出 在应用系统开发...
    99+
    2022-10-18
  • php8到底有哪些性能提升
    php8提高的性能包括:1、JIT编译器的引入;2、函数调用的优化;3、垃圾回收机制的改进;4、类型系统的改进;5、新的语言特性;6、优化字符串处理;7、改进数组处理;8、引入新的内存管理机制;9、优化代码生成。详细介绍:1、JIT编译器的...
    99+
    2023-12-21
    PHP8
  • 提升Redis性能的小技巧有哪些
    这篇文章主要介绍了提升Redis性能的小技巧有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。01 使用 p...
    99+
    2022-10-19
  • 提高电脑性能的方法有哪些
    提高电脑性能的方法有以下几种:1. 清理磁盘空间:删除无用的文件和程序,清理浏览器缓存等,以释放磁盘空间。2. 使用优化软件:可以使...
    99+
    2023-09-06
    电脑
  • python性能优化的方法有哪些
    Python性能优化的方法有:1. 使用更高效的算法和数据结构:选择合适的算法和数据结构可以减少时间和空间复杂度,从而提高性能。2....
    99+
    2023-09-08
    python
  • 提升Web开发性能的技巧有哪些
    本篇内容介绍了“提升Web开发性能的技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、采用反向代...
    99+
    2022-10-19
  • 提高ASP.NET首页性能的方法有哪些
    本篇内容介绍了“提高ASP.NET首页性能的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言本文是我对ASP.NET页面载入速度...
    99+
    2023-06-17
  • 提高java程序性能的方法有哪些
    尽量指定类的final修饰符,带有final修饰符的类是不可派生的在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了人们覆盖length()方法。另外,如果指定一个...
    99+
    2021-12-12
    提高 java 程序 性能
  • oracle提升查询效率的方法有哪些
    提升Oracle查询效率的方法有:1. 使用索引:在表中创建适当的索引可以大大提高查询性能。索引可以帮助数据库快速定位到需要的数据,...
    99+
    2023-09-07
    oracle
  • 提升服务器可用性的办法有哪些
    提升服务器可用性的办法有:1、采用IDERAID磁盘阵列来实现数据冗余功能,从而提高服务器磁盘子系统的性能;2、采用ECC技术,保证服务器内存、缓存中数据的高可靠性;3、给服务器搭建专用电源,减少因电源故障引起的服务器故障问题出现;4、附加...
    99+
    2022-10-23
  • 2021年提升编程技能的方式有哪些
    这篇文章主要讲解了“2021年提升编程技能的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“2021年提升编程技能的方式有哪些”吧!编程游戏当我们谈...
    99+
    2022-10-19
  • 美国网站服务器提升安全性的方法有哪些
    美国网站服务器提升安全性的方法有:1、及时更新服务器操作系统以及安全补丁,避免出现系统漏洞被攻击;2、给美国网站服务器配置防火墙,提高服务器防御能力;3、给美国网站服务器安装安全软件,扫描系统潜在安全隐患并及时处理;4、给美国网站服务器配置...
    99+
    2022-10-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作