文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python代码性能优化

2023-01-31 08:07

关注

Python性能优化的一般步骤:

步骤1:找到性能 瓶颈
步骤2:优化性能 瓶颈
步骤3:goto 『步骤1』

找出瓶颈

不要相信直觉,使用专业工具

使用专业工具:

profile / cprofile

line_profiler

ipython: %prun

使用 timeit 模块来评判性能

import timeit
timeit.Timer(…).timeit()
ipython: %prun

例一:

def function1(): 
    for item in range(1000000):         
        pass

在python2中,range的实现方式是直接在内存中开辟一个静态的数组,而xrange则是通过迭代的方式动态的去生成,所以显而易见,在需要的数据量特别大的时候,range则会非常的耗费内存,所以其优化方式如下:

def function2(): 
    for item in xrange(1000000):         
        pass

简单来说,就是在需要range时,用xrange来代替,需要注意的是,在python3中,已经用xrange来代替range了,所以在python3里面,不存在这种性能问题。

例二:

def function1(l):
    result = []
    for i in l:
        if i % 2 == 0:
            result.append(i)
    return result

列表迭代式相对与一般的for循环或while循环迭代方式拥有更好的性能,所以可以用列表迭代式进行代替,但是这样会大大降低代码的可读性,所以在性能和代码可读性方面要认真权衡。

def function2(l):
    return [i for i in l if i % 2 == 0]

例三:

def add_two(i):
    return i + 2

def function1(l):
    result = []
    for item in l:
        result.append(chr(add_two(item)))
    return result

在python里,访问局部变量的速度要快于访问全剧变量,并且函数调用开销也是不容忽视的。因此,可以通过以下方式来进行优化:

def function2(l):
    result = []
    lchr = chr
    for item in l:
        result.append(lchr(item + 1))
    return result

例四:

l = range(10000) 

def function1(): 
    return 9000 in l

上边提到过,range的效率是相当低的,这是第一点,第二点是在判断一个数是否在一个列表中时,采用迭代的方式来判断,其时间复杂度是O(n),而当采用set时,由于set的实现方式是基于哈希的方式进行存取的,故在找一个元素是否在一个列表里的时候,其时间复杂度为O(1),效率提高了n倍,而且n越大,效率提高的就越明显。

s = set(range(10000)) 

def function2(item): 
    return item in s

例五:

def function1():
    l = []
    for i in xrange(10000):
        l.insert(0, i)

这段代码的功能是往列表里面插入1-10000,且每次将新的元素插入到列表0号位置,但是由于列表的特性,每次插入到最左端的话,就需要将列表已存入的值整体右移,再将新的值插入0号位置。这样将使大量的时间耗费在移动元素上,造成效率低下,对于这种要求,我们可以使用deque来做双端队列。总结来说就是用正确的结构来做正确的事情。类似的结构还有:bisect / heapq / array / collections等。

from collections import deque 

def function2(): 
    l = deque() 
    for i in xrange(10000):
        l.appendleft(i)

本文固定链接:http://blog.dreamchasinger.cn/?p=603
欢迎访问我的自建博客:http://blog.dreamchasinger.cn

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯