从这五个方面提升python的执行效率,才是软件开发层面需要考虑的问题!

这篇具有很好参考价值的文章主要介绍了从这五个方面提升python的执行效率,才是软件开发层面需要考虑的问题!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python作为使用最广泛的编程语言之一,有着无穷无尽的第三方非标准库的支持。

简单的语法、优雅的代码块使其在各个业务领域都混的风生水起,除了这些优点,python有一个经常被人诟病的缺点那就是运行速度。

小伙伴通过下面的五个python开发技巧,来充分提高python代码块的运行速度,并且提供了各个python技巧的使用后的运行时间的统计来佐证。

开始之前小伙伴先可以开发一个统计函数运行时间的python装饰器用于后面我们对各个python技巧使用后的时间统计。

# 导入时间提取的time模块
from time import time

import dis


def compute_time(func_):
    '''
    计算函数的运行时间
    '''

    def func_time(*arg, **kw):
        t1 = time()
        result = func_(*arg, **kw)
        t2 = time()
        print(f"{func_.__name__: >10} : {t2 - t1:.6f} 秒")
        return result

    return func_time

上述的compute_time时间计算函数我们开发好了,可以开发一个hello_world函数测试一下使用是否正常。

@compute_time
def hello_world():
    print("hello_world!")


hello_world()

# hello_world!
# hello_world : 0.000000 秒

通过hello_world函数的测试,证明我们的时间装饰器compute_time能够正常统计出函数所运行的时间。

接下来,我们开始正式的介绍下面的五种方式来提高python的运行速度并提供时间运行的结果。

1、合理使用标准或非标准库

在开发过程中绝对不能小看python的标准或非标准库,说实话我们自己有时候写的同样的业务代码块确实是没有大佬们完美。

比如下面这个业务我们需要将一个python列表中的值转换成字符串,首先看看下面的代码块的写法。

# 初始化一个list列表
list_ = ['a', 'b', 'c'] * 10000


@compute_time
def func_1(list_=None):
    '''
    列表元素转字符串函数
    '''
    str_ = ''
    for s in list_:
        str_ = str_ + s
    return str_


func_1(list_)


# func_1 : 0.001999 秒

通过上面的func_1函数的执行情况使用自己写的传统的方式来转换步骤比较繁杂,并且花费了0.001999 秒的时间。

@compute_time
def func_2(list_=None):
    '''
    列表元素转字符串
    '''
    return ''.join(list_)


func_2(list_)

# func_2 : 0.000000 秒

相比func_1函数的运行时间,func_2运行的时间几乎可以忽略不计,六位数的小数根本看不出来变化。

2、减少循环的使用

从平常开发的过程中其实已经发现,使用列表推导式、迭代式等的可序列化数据处理方式要比for循环更加的便捷、高效。

下面我们同样可以通过一个例子来说明问题,比如我们需要挑选出一个list列表中可以被2整除的数。

# 初始化循环次数n
n = 100000


@compute_time
def func_3(n=None):
    list_ = []
    for m in range(n):
        if m % 2 == 0:
            list_.append(m)
    return list_


@compute_time
def func_4(n=None):
    return [m for m in range(n) if m % 2 == 0]


func_3(n)

func_4(n)

# func_3 : 0.004986 秒
# func_4 : 0.003014 秒

通过func_3函数、func_4函数的比较,首先func_4的方式比func_3精简了许多。

并且时间上func_4使用列表推导式的方式比普通的for循环运行速度上快了1/4的时间。

3、注意重复代码运行

关于代码的重复运行这个在我们通常的开发方式中都能体会到,也就是本可以作为公共代码块运行一次就可以。

可以却将能够公共使用的代码块加入到了循环当中,这样只会影响代码块的执行效率。

比如我们需要使用python的re模块去搜索字符串中的某一些元素,下面通过两种方式来比较时间结果。

# 导入正则表达式匹配模块
import re


@compute_time
def func_5(str_=None):
    for s in str_:
        result = re.search(r'a*[a-z]?c', s)


@compute_time
def func_6(str_=None):
    repx = re.compile(r'a*[a-z]?c')
    for s in str_:
        result = repx.search(s)


func_5('abcdefg1234oks' * 1000)

func_6('abcdefg1234oks' * 1000)

# func_5 : 0.006999 秒
# func_6 : 0.002000 秒

对比func_5和func_6的业务实现方式,我们将re模块的compile正则匹配对象直接放到for循环的外层,运行时间直接就减少了3倍不止。

是因为在循环中直接使用search匹配正则对象,会在循环中不断地创建正则匹配对象,这样就
增加了for循环的处理负担,导致速度变慢。

4、减少全局变量使用

在说明这一点的时候,我们要明白全局变量在程序运行的过程中是一直存在的不会消失。

全局变量太多就会导致运行期间占用的内存太大,相比全局变量使用局部变量就会变得更加的高效。

下面我们通过两种方式的使用实例,来对比全局变量和局部变量的运行时间。

mes_1 = 'ss1'

mes_2 = 'ss2'

mes_3 = 'ss3'


@compute_time
def func_7():
    result = mes_1 + mes_2 + mes_3
    return result


@compute_time
def func_8():
    me_1 = 'ss1'
    me_2 = 'ss2'
    me_3 = 'ss3'
    result = me_1 + me_2 + me_3
    return result


func_7()

func_8()


# func_7 : 0.000997 秒
# func_8 : 0.000000 秒

上面我们做了一个普通的加法计算已经说明了问题,func_8函数使用局部变量的方式确实速度更快。

5、使用合理的数据结构

在大多数的python开发过程中,想必很多人都是为了方便更多的时候使用的是list列表的方式来处理数据。

Python 有四种内置的数据结构:列表、元组、集合、字典,在合适的业务场景中使用合适的数据结构来处理数据同样能提高计算的执行效率。

比如:下面我们将从一个list列表和tuple元组来提取对应索引位置上面的值。

@compute_time
def func_9():
    data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
    print(data[3])


@compute_time
def func_10():
    data = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')
    print(data[3])

func_9()

func_10()

# func_9 : 0.000000 秒
# func_10 : 0.000000 秒

通过执行func_9和func_10函数,我们发现时间上两者的差距不大,起码在六位小数之内是分辨不出结果的。

print('func_9汇编产生的机器码:')
dis.dis(func_9)

print('func_10汇编产生的机器码:')
dis.dis(func_10)

最后,我们分别查看了func_9和func_10的汇编机器码,发现明显list列表处理产生的机器码更多。

# func_9汇编产生的机器码:
#  30           0 LOAD_GLOBAL              0 (time)
#               2 CALL_FUNCTION            0
#               4 STORE_FAST               2 (t1)
#
#  31           6 LOAD_DEREF               0 (func_)
#               8 LOAD_FAST                0 (arg)
#              10 LOAD_FAST                1 (kw)
#              12 CALL_FUNCTION_EX         1
#              14 STORE_FAST               3 (result)
#
#  32          16 LOAD_GLOBAL              0 (time)
#              18 CALL_FUNCTION            0
#              20 STORE_FAST               4 (t2)
#
#  33          22 LOAD_GLOBAL              1 (print)
#              24 LOAD_DEREF               0 (func_)
#              26 LOAD_ATTR                2 (__name__)
#              28 LOAD_CONST               1 (' >10')
#              30 FORMAT_VALUE             4 (with format)
#              32 LOAD_CONST               2 (' : ')
#              34 LOAD_FAST                4 (t2)
#              36 LOAD_FAST                2 (t1)
#              38 BINARY_SUBTRACT
#              40 LOAD_CONST               3 ('.6f')
#              42 FORMAT_VALUE             4 (with format)
#              44 LOAD_CONST               4 (' 秒')
#              46 BUILD_STRING             4
#              48 CALL_FUNCTION            1
#              50 POP_TOP
#
#  34          52 LOAD_FAST                3 (result)
#              54 RETURN_VALUE
# func_10汇编产生的机器码:
#  30           0 LOAD_GLOBAL              0 (time)
#               2 CALL_FUNCTION            0
#               4 STORE_FAST               2 (t1)
#
#  31           6 LOAD_DEREF               0 (func_)
#               8 LOAD_FAST                0 (arg)
#              10 LOAD_FAST                1 (kw)
#              12 CALL_FUNCTION_EX         1
#              14 STORE_FAST               3 (result)

往期精彩

这款基于ChatGPT4的开发工具,程序猿要小心了!

刚刚在GitHub发现的开数据源可视化分析工具,只通过配置的方式即可完成个性化的可视化应用制作!

自动化办公:python文件分类器,一键完成杂乱无章的文件整理,已打包成exe可自行下载!文章来源地址https://www.toymoban.com/news/detail-413276.html

到了这里,关于从这五个方面提升python的执行效率,才是软件开发层面需要考虑的问题!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 提升Python os.system调用Shell的执行效率

      最近做了一个SDN流表的实验,在这个实验中,需要批量删除大量的流表项,使用了shell脚本。然而,我的流表数据存放在python字典中,我一开始是考虑每次读取一个字典并构造一条指令调用os.system(),然后发现这种方法效率非常糟糕。 我考虑问题可能出现在os.system()的调用上

    2023年04月21日
    浏览(22)
  • 解决流水线瓶颈、提升编码效率的五个方法(上篇)

    不是吹牛,但我所管理的开发团队在软件开发速度上表现出色,能够高质量地编写代码,并在白噪声的陪伴下保持高效。 但就像所有的故事一样,一开始并不是这样的,甚至相去甚远。我们经历了时间、沟通、合作、失败、成功以及许多关于生产力的会议(有时很尴尬,但它

    2023年04月20日
    浏览(30)
  • 构建可观测架构,从这5个方面着手

    随着系统复杂度的提升,“可观测性”(Observability)成为架构建设的重要原则之一。那么构建一个可观测的系统架构需要做哪些工作呢?本文将从以下5个方面介绍构建可观测架构的主要考虑: 首先要确定核心业务指标,比如请求响应时间、错误率、吞吐量等。这些指标直接关联到用

    2024年02月14日
    浏览(24)
  • mysql优化一般从这几个方面出发

    MySQL 优化是针对数据库性能和查询效率的一系列操作和策略,旨在提高数据库的响应速度、降低资源消耗,并优化查询执行计划。以下是一些常见的 MySQL 优化技巧: 1、 使用合适的数据类型:选择合适的数据类型可以节省存储空间和提高查询效率。尽量使用更小的数据类型,

    2024年02月15日
    浏览(34)
  • 知识库网站如何搭建?需要注意这五个要点!

    正因为知识库提供结构化知识库来记载信息和知识,便于团队沉淀经验、共享资源,形成完整的知识体系并持续进化​,使得它成为当前企业发展新宠。 构建自己/团队的知识库是一个良好的习惯,可以提高工作和学习效率,以下是一些高效构建自己的知识库的方法,希望能

    2024年02月09日
    浏览(30)
  • pdf转jpg怎么解决?这五个转换方法快速搞定!

    pdf转jpg怎么转?pdf是在我们工作中经常使用的一种办公文件格式类型,但是在某些特殊情况下,我们应该把pdf转jpg图片格式文件,很多人在这种情况下不知道如何把pdf转jpg图片格式文件,接下来我们一起来了解下pdf转jpg转换方法有哪些?  PDF转图片教程 PDF转图片方法一:使用

    2023年04月21日
    浏览(44)
  • 想要检测TikTok网络是否安全?这五个网站请收好

    Tiktok目前在海外大火,越来越多的人想要进入TikTok的海外市场并捞一桶金。然而,成功并非易事。想要在TikTok中立足,我们必须保证我们的设备、网络环境和网络节点完全符合官方的要求,并且没有任何异常或风险。那么我们该如何设置、以及设置完成后如何检测自己账号的

    2024年02月02日
    浏览(27)
  • 这五个问题一下就看出阿里通义千问和ChatGPT的差距了

    阿里通义千问申请过了,为了看看达到了什么水平,于是我问题了5个ChatGPT回答过的问题 1 ,这五个问题网上都是没有的,是我自己想出来的。 这是一个有趣的问题,但是也有一些误解。公鸡蛋并不是公鸡下的蛋,而是指公鸡的睾丸,也就是公鸡的生殖器官。所以小明说他吃

    2024年02月04日
    浏览(383)
  • MySQL优化:12种提升SQL执行效率的有效方法

    在数据库管理和优化的世界里,MySQL作为一个流行的关系型数据库管理系统,其性能优化是任何数据密集型应用成功的关键。优化MySQL数据库不仅可以显著提高SQL查询的效率,还能确保数据的稳定性和可靠性。 在本文中,我将介绍12种提升SQL执行效率的有效方法,并通过实用的

    2024年01月16日
    浏览(34)
  • 怎么迅速做出高端、还会动的数据图表?来看看这五个大数据可视化神器!

    其实很简单。大数据可视化就是指通过 图表、图形、地图等视觉化方式 , 将庞大、复杂的大数据集合转化为直观、易于理解和分析的图像展示。 它的目的是 帮助人们更好地理解和解释大数据,发现数据中的模式、趋势和关联,从而支持决策和洞察。 大数据可视化可以将抽

    2024年02月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包