分享

Python 优化技巧-让你的代码运行速度提高10 倍

 流形sbz 2023-11-17 发布于甘肃
Python 优化技巧-让你的代码运行速度提高10 倍

Python 是一种解释语言,这意味着它的运行速度可能不如CC++等编译语言。但是,您可以利用某些技术和策略来优化 Python 代码并提高其性能。代码优化涉及使代码运行得更快、使用更少的资源并且执行更流畅,从而提高其性能和效率。

使用推导式和生成器

在 2.7 和 3.0 版本中,Python 除其他功能外还发布了以下功能:列表理解、字典理解和密切相关的集合理解。这些功能使得以更干净、简洁和更有效的方式生成列表、字典和集合变得更容易。使用传统的“循环和追加”方法创建一个函数并生成一个列表:

>>> def do_1 (): ... list_object = [] ... for i in range ( 100 ): ... list_object.append(i)

导入Python内置的timeit模块来查看这个函数运行了多长时间:

>>>导入timeit >>> t = timeit.Timer(setup= 'from __main__ import do_1' , stmt= 'do_1()' ) >>> print (t.timeit()) 9.681053700041957

上面的输出显示该函数运行大约需要9.68 秒。

现在,使用推导式生成此列表并查看需要多长时间:

>>> def do (): ... [i for i in range ( 100 )] >>> t = timeit.Timer(setup= 'from __main__ import do' , stmt= 'do()' ) >>> t.timeit() 7.292758799972944

从上面的代码中可以看出,该函数的运行时间约为7.29秒,而前一个函数的运行时间为9.68秒(无法理解),相差2.39秒。除了理解更简洁、更容易阅读之外,它也更快。这使得它成为生成列表和循环的首选方法。

避免字符串连接

+=开发人员通常使用使用运算符来连接字符串来连接字符串。但是,在循环内,由于字符串的不可变性质,它可能会很慢。

相反,请使用str.join()有效串联的方法。

使用运算+=符连接字符串并查看其执行时间:

>>> def  do (): ...     obj = [ 'hello' , 'my' , 'name' , 'is' , 'Delight' , '!' ] ...     s = '' ...     for elem in obj: ...         s += elem >>> import timeit >>> t = timeit.Timer(setup= 'from __main__ import do' , stmt= 'do ()' ) >>> t.timeit() 0.9870554000372067

该函数(使用+=运算符实现字符串连接)大约需要0.98秒才能完成。

使用join()替代方法进行有效串联:

>>> def do (): ... s = [ 'hello' , 'my' , 'name' , 'is' , 'Delight' , '!' ] ... '' .join(s) >>> import timeit >>> t = timeit.Timer(setup= 'from __main__ import do' , stmt= 'do()' ) >>> t.timeit() 0.38973289995919913

使用join()将函数的执行时间从0.98 秒减少到0.38 秒,这使其成为连接字符串的更快且更好的方法。

循环

在 Python 中,for 循环是一种控制结构,允许迭代一系列项目,例如列表中的元素、字符串中的字符或其他可迭代对象中的元素。for 循环对序列中的每一项重复执行代码块,从第一项迭代到最后一项。

然而,在大多数情况下,for 循环可以被更有效的函数(称为map(). 该map()函数是一个内置的高阶函数,允许将给定函数应用于可迭代对象(例如列表、元组或字符串)中的每个项目,并生成一个新的可迭代对象,其中包含将该函数应用于每个项目的结果物品。使用的主要优点map()是它提供了一种简洁有效的数据转换方法,而不需要显式循环。

比较实现for 循环和的函数的执行时间map()

def  do ():     obj = [ 'hello' , 'my' , 'name' , 'is' , 'Delight' , '!' ]     new = []     for i in obj:         new.append(i.upper())

获取该函数的执行时间:

>>>导入timeit >>> t = timeit.Timer(setup= 'from __main__ import do' , stmt= 'do()' ) >>> t.timeit() 1.042804399970919

使用内置函数实现相同的函数map()并获取执行时间:

>>> def  square ( x ): ...     return x.upper() >>> def  do (): ...     obj = [ 'hello' , 'my' , 'name' , 'is' , 'Delight ”、“!” ] ...     map (square, obj) >>> import timeit >>> t = timeit.Timer(setup= 'from __main__ import do' , stmt= 'do()' ) >>> t.timeit() 0.37273399997502565

在上面的代码中,使用map()而不是for 循环使函数的运行速度提高了大约3 倍

Python的内置函数使我们的代码运行得更快,主要是因为它们是用C语言编写和编译的。

选择正确的数据结构

选择正确的数据结构会对 Python 代码的速度和效率产生重大影响。不同的数据结构针对特定类型的操作进行了优化,选择合适的数据结构可以加快查找、插入、删除速度,并提高整体性能。

例如,使用集合进行成员资格测试比使用列表快得多:

>>> def do (): ... fruits_list = [ '苹果' , '香蕉' , '橙子' , '葡萄' , '梨' ] ... '香蕉' 在fruits_list ... '猕猴桃' 在fruits_list >>> import timeit >>> t = timeit.Timer(setup= 'from __main__ import do' , stmt= 'do()' ) >>> t.timeit() 0.48580530006438494 >>> def do (): .. 。 Fruits_list = { '苹果', '香蕉' , '橙' , '葡萄' , '梨' } ... '香蕉' 在fruits_list ... '猕猴桃' 在fruits_list >>> import timeit >>> t = timeit.Timer(setup= '来自 __main__ import do' , stmt= 'do()' ) >>> t.timeit() 0.34570479998365045

避免全局变量

全局变量在跨程序共享数据方面发挥着重要作用。但是,应谨慎使用它们,并且仅在必要时使用。访问全局变量比访问局部变量慢。请注意始终尽量减少全局变量的使用,尤其是在循环内。

矢量化

Python 中的向量化是指对整个数组或数据序列应用操作的做法,而不是使用显式循环来迭代单个元素。它利用NumPy等专用库在数组上高效执行逐元素操作,利用硬件级优化并减少对显式循环构造的需求。

如果要执行数值计算,请考虑使用NumPy等库,它提供优化的数组操作,其速度比在标准 Python 列表中执行按元素操作要快得多。

矢量化是科学计算和数值分析中的基本概念,它在使 Python 成为数据分析、机器学习和其他涉及大型数据集的计算任务的强大语言方面发挥着至关重要的作用。

避免不必要的函数调用

避免 Python 中不必要的函数调用对于提高代码的效率和性能非常重要。不必要的函数调用会带来开销、消耗内存并减慢程序的执行速度。尽可能组合操作。

避免不必要的进口声明

import语句几乎可以在任何地方执行。将它们放置在函数内部以限制其可见性和/或减少初始启动时间通常很有用。—Python.org

避免 Python 中不必要的 import 语句对于维护干净、高效和可读的代码至关重要。不必要的导入有时会导致模块之间的循环依赖。这可能会在运行时导致问题,并使重构代码变得更加困难。

尽管现代文本编辑器现在可以让您轻松识别程序中未使用的代码,但添加未使用的导入可能会使这些编辑器感到困惑。

编译你的代码

如果性能是程序执行的关键因素,请考虑使用Cython等工具,它将代码编译为CC++。这可以显着提高程序的性能。

分析您的代码

Python 中的分析是测量和分析代码的执行时间及其资源使用情况,以便找到代码中的瓶颈和优化机会。

Python 提供了各种内置的分析工具,例如profiletimeit

do()以下是对使用该模块命名的函数进行分析的示例profile

导入配置文件profile.run( 'do()' )

及时了解 Python 版本

较新的 Python 版本通常包括性能增强、错误修复、安全更新等。

Python 优化技巧-让你的代码运行速度提高10 倍

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多