iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >优化python执行效率
  • 197
分享到

优化python执行效率

效率python 2023-01-31 01:01:38 197人浏览 独家记忆

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

摘要

开始优化前,写一个高级测试来证明原来代码很慢。你可能需要采用一些最小值数据集来复现它足够慢。通常一两个显示运行时秒的程序就足够处理一些改进的地方了。有一些基础测试来保证你的优化没有改变原有代码的行为也是很必要的。你也能够在很多次运行测试来优

开始优化前,写一个高级测试来证明原来代码很慢。你可能需要采用一些最小值数据集来复现它足够慢。通常一两个显示运行时秒的程序就足够处理一些改进的地方了。


有一些基础测试来保证你的优化没有改变原有代码的行为也是很必要的。你也能够在很多次运行测试来优化代码的时候稍微修改这些测试的基准。


那么现在,我们来来看看优化工具把。

简单的计时器


计时器很简单,这是一个最灵活的记录执行时间的方法。你可以把它放到任何地方并且副作用很小。运行你自己的计时器非常简单,并且你可以将其定制,使它以你期望的方式工作。例如,你个简单的计时器如下:

import time    

def timefunc(f):  

def f_timer(*args, **kwargs):  

 start = time.time()   result = f(*args, **kwargs)  

 end = time.time()   print f.__name__, 'took', end - start, 'time'  return result  return f_timer    def get_number():  for x in xrange(5000000):   yield x    @timefuncdef expensive_function():  for x in get_number():   i = x ^ x ^ x  return 'some result!'   # prints "expensive_function took 0.72583088875 seconds" result = expensive_function() 


当然,你可以用上下文管理来让它功能更加强大,添加一些检查点或者一些其他的功能:

 import time    class timewith():  def __init__(self, name=''):   self.name = name   self.start = time.time()     @property def elapsed(self):   return time.time() - self.start     def checkpoint(self, name=''):   print '{timer} {checkpoint} took {elapsed} seconds'.fORMat(    timer=self.name,    checkpoint=name,    elapsed=self.elapsed,   ).strip()     def __enter__(self):   return self    def __exit__(self, type, value, traceback):   self.checkpoint('finished')   pass   def get_number():  for x in xrange(5000000):   yield x    def expensive_function():  for x in get_number():   i = x ^ x ^ x  return 'some result!'   # prints something like: # fancy thing done with something took 0.582462072372 seconds # fancy thing done with something else took 1.75355315208 seconds # fancy thing finished took 1.7535982132 seconds with timewith('fancy thing') as timer:  expensive_function()  timer.checkpoint('done with something')  expensive_function()  expensive_function()  timer.checkpoint('done with something else')    # or directly timer = timewith('fancy thing') expensive_function() timer.checkpoint('done with something') 


计时器还需要你做一些挖掘。包装一些更高级的函数,并且确定瓶颈在哪,然后深入的函数里,能够不停的重现。当你发现一些不合适的代码,修复它,然后测试一遍以确认它被修复了。


一些小技巧:不要忘了好用的timeit模块!它对小块代码做基准测试而不是实际调查更加有用。


    Timer 优点:很容易理解和实现。也非常容易在修改后进行比较。对于很多语言都适用。 

    Timer 缺点:有时候对于非常复杂的代码有点过于简单,你可能会花更多时间放置或移动引用代码而不是修复问题! 

内建优化器


启用内建的优化器就像是用一门大炮。它非常强大,但是有点不太好用,使用和解释起来比较复杂。


你可以了解更多关于profile模块的东西,但是它的基础是非常简单的:你能够启用和禁用优化器,而且它能打印所有的函数调用和执行时间。它能给你编译和打印出输出。一个简单的装饰器如下:

 import cProfile    def do_cprofile(func):  def profiled_func(*args, **kwargs):   profile = cProfile.Profile()   try:    profile.enable()    result = func(*args, **kwargs)    profile.disable()    return result   finally:    profile.print_stats()  return profiled_func    def get_number():  for x in xrange(5000000):   yield x    @do_cprofiledef expensive_function():  for x in get_number():   i = x ^ x ^ x  return 'some result!'   # perform profiling result = expensive_function() 


在上面代码的情况下,你应该看到有些东西在终端打印出来,打印的内容如下:

5000003 function calls in 1.626 seconds     Ordered by: standard name     ncalls tottime percall cumtime percall filename:lineno(function)  5000001 0.571 0.000 0.571 0.000 timers.py:92(get_number)   1 1.055 1.055 1.626 1.626 timers.py:96(expensive_function)   1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 


你可以看到,它给出了不同函数的调用次数,但它遗漏了一些关键的信息:是哪个函数让运行这么慢?


可是,这对于基础优化来说是个好的开始。有时候甚至能用更少的精力找到解决方案。我经常用它来在深入挖掘究竟是哪个函数慢或者调用次数过多之前来调试程序。


    内建优点:没有额外的依赖并且非常快。对于快速的高等级检查非常有用。 

    内建缺点:信息相对有限,需要进一步的调试;报告有点不太直接,尤其是对于复杂的代码。 

Line Profiler


如果内建的优化器是一门大炮,那么line profiler可以看作是一门离子加农炮。它非常的重量级和强大。


在这个例子里,我们会用非常棒的line_profiler库。为了容易使用,我们会再次用装饰器包装一下,这种简单的方法也可以防止把它放在生产代码里。

 

try:  from line_profiler import LineProfiler     def do_profile(follow=[]):   def inner(func):    def profiled_func(*args, **kwargs):     try:      profiler = LineProfiler()      profiler.add_function(func)      for f in follow:       profiler.add_function(f)      profiler.enable_by_count()      return func(*args, **kwargs)     finally:      profiler.print_stats()    return profiled_func   return inner    except ImportError:  def do_profile(follow=[]):   "Helpful if you accidentally leave in production!"  def inner(func):    def nothing(*args, **kwargs):     return func(*args, **kwargs)    return nothing   return inner    def get_number():  for x in xrange(5000000):   yield x    @do_profile(follow=[get_number]) def expensive_function():  for x in get_number():   i = x ^ x ^ x  return 'some result!'   result = expensive_function() 


如果你运行上面的代码,你就可以看到一下的报告:

 Timer unit: 1e-06 s    File: test.py Function: get_number at line 43Total time: 4.44195 s    Line #  Hits   Time Per Hit % Time Line Contents ============================================================== 43           def get_number():  44 5000001  2223313  0.4  50.1  for x in xrange(5000000):  45 5000000  2218638  0.4  49.9   yield x    File: test.py Function: expensive_function at line 47Total time: 16.828 s    Line #  Hits   Time Per Hit % Time Line Contents ============================================================== 47           def expensive_function():  48 5000001  14090530  2.8  83.7  for x in get_number():  49 5000000  2737480  0.5  16.3   i = x ^ x ^ x  50   1   0  0.0  0.0  return 'some result!' 


你可以看到,有一个非常详细的报告,能让你完全洞悉代码运行的情况。不想内建的cProfiler,它能计算话在语言核心特性的时间,比如循环和导入并且给出在不同的行花费的时间。


这些细节能让我们更容易理解函数内部。如果你在研究某个第三方库,你可以直接将其导入并加上装饰器来分析它。


一些小技巧:只装饰你的测试函数并将问题函数作为接下来的参数。


     Line Profiler 优点:有非常直接和详细的报告。能够追踪第三方库里的函数。 

     Line Profiler 缺点:因为它会让代码比真正运行时慢很多,所以不要用它来做基准测试。这是额外的需求。 

总结和最佳实践


你应该用更简单的工具来对测试用例进行根本的检查,并且用更慢但能显示更多细节的line_profiler来深入到函数内部。


九成情况下,你可能会发现在一个函数里循环调用或一个错误的数据结构消耗了90%的时间。一些调整工具是非常适合你的。


如果你仍然觉得这太慢,而是用一些你自己的秘密武器,如比较属性访问技术或调整平衡检查技术。你也可以用如下的方法:


1.忍受缓慢或者缓存它们


2.重新思考整个实现


3.更多使用优化的数据结构


4.写一个C扩展


注意了,优化代码是种罪恶的快感!用合适的方法来为你的python代码加速很有意思,但是注意不要破坏了本身的逻辑。可读的代码比运行速度更重要。先把它缓存起来再进行优化其实更好。



--结束END--

本文标题: 优化python执行效率

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

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

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

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

下载Word文档
猜你喜欢
  • 优化python执行效率
    开始优化前,写一个高级测试来证明原来代码很慢。你可能需要采用一些最小值数据集来复现它足够慢。通常一两个显示运行时秒的程序就足够处理一些改进的地方了。有一些基础测试来保证你的优化没有改变原有代码的行为也是很必要的。你也能够在很多次运行测试来优...
    99+
    2023-01-31
    效率 python
  • 优化Python脚本在Linux上的执行效率
    标题:优化Python脚本在Linux上的执行效率引言:Python是一种高级动态编程语言,以其简单易学、灵活性和强大的库支持而广泛受到开发者的欢迎。然而,Python在执行效率方面相对较慢,尤其是涉及大量数据处理或计算密集型任务时。本文将...
    99+
    2023-10-22
    优化 执行效率 Python脚本
  • PHP如何优化接口执行效率
    小编给大家分享一下PHP如何优化接口执行效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!造成执行效率低的原因可以由很多方面找原...
    99+
    2022-10-19
  • MySQL---SQL优化上(explain分析执行计划、查看SQL的执行效率、定位低效率SQL)
    1. 查看SQL的执行效率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以查看服务器状态信息。通 过查看状态信息可以查看对当前数据库的主要操作类型。 --下面的命令显示了当前 sess...
    99+
    2023-09-07
    mysql sql 数据库
  • PHP开发中如何优化代码执行效率
    一、使用合适的数据结构在PHP开发中,使用合适的数据结构可以大大提高代码执行效率。以下是一些常用的数据结构及其优化方法:数组(Array)优化:尽量使用多维数组或关联数组,而不是一维数组,可以提高查找和插入的效率。在大数据量的情况下,考虑使...
    99+
    2023-10-21
    PHP开发 代码优化 执行效率
  • 如何优化PHP开发中的代码执行效率和性能
    随着互联网的高速发展,PHP作为一门扎根于网络开发的脚本语言,被广泛应用于网页开发、服务器编程等领域。然而,PHP代码执行效率和性能问题一直是开发者们面临的挑战。在本文中,我们将探讨如何通过优化PHP代码来提高执行效率和性能,同时给出具体的...
    99+
    2023-10-21
    优化 PHP 代码执行
  • Django 中的编程算法:如何优化函数的执行效率?
    Django 是一款功能强大的 Web 框架,它使用 Python 语言编写。在 Django 中,编写高效的函数并不是一件容易的事情,特别是在处理大量数据时,函数的执行效率往往会成为一个瓶颈。本文将介绍一些优化 Django 函数执行效率...
    99+
    2023-10-09
    函数 django 编程算法
  • LeetCode算法面试:如何优化GO语言函数的执行效率?
    随着互联网技术的迅猛发展,人工智能、大数据等新兴技术的涌现,算法面试已成为求职者进入科技公司的门槛之一。而GO语言作为一门新兴语言,近年来也受到了越来越多的关注。在算法面试中,GO语言的函数执行效率也成为了面试官关注的焦点。本文将介绍如何...
    99+
    2023-08-30
    面试 函数 leetcode
  • 如何提高JavaScript执行效率
    这篇文章将为大家详细讲解有关如何提高JavaScript执行效率,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。文中所提供的代码片段都已经过最新版的Chrome 30测试,...
    99+
    2022-10-19
  • 提升Python的执行效率的技巧有哪些
    今天小编给大家分享一下提升Python的执行效率的技巧有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。开始之前小伙伴先可...
    99+
    2023-07-06
  • python多线程效率低如何优化
    有几种方法可以优化Python多线程的效率: 使用Python的多进程模块:由于Python的全局解释器锁(GIL)限制了多线程...
    99+
    2023-10-25
    python
  • innerjoin 和 exists的执行效率区别
    今天在实现业务时发现经常使用exists语句竟然执行效率低下根本不出结果,反而innerjoin可以瞬间得到结果。后来发现是因为exsits需要从40万的数据集中去匹配200条数据是非常消耗资源的。总结:首...
    99+
    2022-10-18
  • 五个提升Python的执行效率的技巧分享
    目录1、合理使用标准或非标准库2、减少循环的使用3、注意重复代码运行4、减少全局变量使用5、使用合理的数据结构python作为使用最广泛的编程语言之一,有着无穷无尽的第三方非标准库的...
    99+
    2023-05-15
    Python提升执行效率技巧 Python提升执行效率 Python 技巧
  • python中怎么优化ChainMap的调用效率
    python中怎么优化ChainMap的调用效率?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python的五大特点是什么python的五大特点:1.简单易学,...
    99+
    2023-06-14
  • MYSQL 中 exists 语句执行效率变低
            在ORACLE 中,我们常常推荐使用exists 来替代in,往往也能取得比较好的优化效果。在ORACLE应用...
    99+
    2022-10-18
  • Task提高异步执行效率技巧
    async Task 语法糖出来后,异步编程变得非常简单,适合需要耗费较长时间的任务。 有些小伙伴使用后可能会非常疑惑,使用异步和同步,在耗时上几乎没有差别。 下面我们看一个例子,场...
    99+
    2022-11-13
  • Task怎么提高异步执行效率
    本篇内容介绍了“Task怎么提高异步执行效率”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!async Task 语法糖出来后,异步编程变得非...
    99+
    2023-06-29
  • 合理优化数据库表结构提高项目执行效率[数据库设计]
    数据库表设计优化:有时为了提高数据库效率,可适当考虑反三范式,适当添加冗余字段,减少多表去关联查询。使用索引:2.1 数据库表设计时要合理的去使用普通索引、主键索引、唯一索引、全文索引以及复合(组合)索引。...
    99+
    2022-10-18
  • PageHelper插件count效率优化
    PageHelper是项目中常用的分页插件,它在完成分页的过程中会执行两条SQL: limit分页sqlcount查总数sql(在不关闭插件count的前提下) 对于百万级以上的数据表,只要添加好索引,limit语句的速度很快,但是coun...
    99+
    2023-09-03
    java mysql
  • 异步编程技术在ASP中的应用:如何优化shell函数的执行效率?
    在ASP的开发中,我们经常需要执行一些外部的命令或程序,比如利用shell函数来执行一些批处理文件或者调用一些外部的可执行文件。然而,这些操作通常会耗费大量的时间,导致网站的响应速度变慢,影响用户的体验。为了解决这个问题,我们可以采用异步...
    99+
    2023-09-30
    异步编程 函数 shell
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作