当前位置: 首页 > 科技观察

Python中的优化,大神写的程序比我们快五倍,原来是这样!

时间:2023-03-14 10:31:31 科技观察

Python是一种强大的编程语言。我们可以这样做来使代码更轻、更快。它不仅支持多处理,而且操作起来很轻松。下面我们列出了一些最佳的Python代码优化提示和技巧。Python评论家有时声称它很慢。但这不是因为Python,而是因为用于编写代码的实践。在本文中,您将找到加速Python应用程序的技巧。由于Python是一种功能丰富的语言,因此总有改进的余地。如果你想让你的Python代码运行得更快、更高效,请继续阅读。这些技巧和Python的美妙之处在于,所有优化技术实际上都在Python的领域。您只需要了解它们并在编码时以有纪律的方式实施它们。最近我们写了一篇关于三十个基本的Python编程技巧和技巧的文章。您也可以查看并找到您不知道的内容。我们从一些您可以利用的核心Python内部结构开始。极客的基本Python代码优化提示和技巧。国际字符串效率。实现字符串是一种只存储每个不同字符串的单个副本的方法。我们可以通过操纵我们的代码来触发字符串的实现,从而使Python解释器重用字符串。通常,当我们创建一个字符串对象时,由Python解释器决定是否缓存该字符串。在处理标识符的某些条件下,它是解释器的固有特性。声明一个名称以字母或下划线开头且仅包含字母/下划线/数字组合的字符串将导致Python嵌入该字符串并为其创建哈希。由于Python有很多使用字典的内部代码,这导致它不执行任何操作。的搜索标识符。因此,在标识符字符串之间执行可加快整个过程。简而言之,Python将所有标识符保存在一个表中,并为每个对象生成一个唯一的键(散列)以供将来查找。这种优化发生在编译期间。它还将实习与类似标识符的字符串文字结合在一起。所以这是Python中一个非常有用的特性,您可以利用它来发挥自己的优势。此类功能可以帮助您加快大型文本挖掘或分析应用程序的处理速度。因为它们需要频繁搜索和计算触发信息。您从文件中读取或通过网络通信接收的字符串不是Python中自动驻留的一部分。相反,您可以将此任务卸载到用于处理此类字符串的intern()函数。窥孔优化技术。窥孔优化是一种优化程序或程序的一小部分指令的方法。该段称为。它可以帮助您找到可以用最小化版本替换的说明。让我们看一下Python如何处理窥孔优化。它有一个内置方法,请查看下面的示例。示例1。该示例有一个函数来初始化它的两个成员。其中一个是字符串,另一个是整数。接下来,另一个代码属性被添加到函数中,默认为。有趣的是,四个文字将作为常量保留在内存中。请参考下图。Python代码优化提示和技巧-示例(1)在附加的快照中,您可以看到我们使用常量<.__code__。共同常量>。它是Python中每个函数对象的三个元组之一。是的,函数在Python中也是一个对象。它包括以下三个元组。1.<__代码__。co_varnames>:保存包含参数的局部变量。2.<__代码__。co_names>:存储全局文字。3.<__代码__。co_consts>:对所有常量的引用。现在,窥孔优化可以做的不仅仅是使可变结构不可变。请参见下面的示例。示例2。在此示例中,我们使用“in”运算符来搜索集合中的特定元素。在这里,Python检测到该集合将用于验证元素的成员资格。因此,无论集合的大小如何,它都将指令视为不变成本操作。并将比元组或列表更快地处理它们。这种方法在Python中称为成员资格测试。请仔细检查随附的屏幕截图。Python代码优化提示和技巧-示例(2)示例3。尽管如此,如果您以与前面示例中的集合类似的方式使用列表对象,Python会将其转换为元组常量。现在,在这个例子中,我们结合了这个集合和列表的使用。并显示两个对象都已转换为常量。请参阅随附的屏幕截图。PythonCodeOptimizationTipsandTricks-Example(3)我们可以通过查看翻译代码的字节码来验证同样的事实。为此,我们必须导入Python的“dis”模块。并将函数对象作为参数传递给“dis”构造函数,将按字节码打印整个内存布局。Python代码优化提示和技巧-示例(4)从附图中的“dis”输出,很容易验证集合和列表是否已变为常量。这里的要点是Python只对文字进行这种转换。如果上面示例中使用的任何集合/列表不是文字,则不会进行优化。分析您的代码如果您在进一步优化代码之前不知道瓶颈在哪里,那就太天真了。因此,首先,使用下面提到的两种方法中的任何一种来配置您的代码。3.1.使用进行秒表分析。这是使用Python的模块进行分析的传统方法。它记录代码段何时被执行。它以毫秒为单位测量时间。上面的例子表明join方法比其他方法更有效。3.2.使用进行高级分析。从Python2.5开始,cProfile是Python包的一部分。它提供了一组很好的分析功能来隔离代码中的瓶颈。您可以通过多种方式绑定到您的代码。比如,将函数包装在其运行方法中以衡量性能。或者,借助Python的“-m”选项,通过命令行运行整个脚本,同时将cProfile作为参数激活。在这里,我们将展示一些基本示例,以便您了解如何使用它。3.2.1.示例(1)-在Python中使用CProfile。查看结果,您可以调查需要改进的地方。更有用的是,我们可以在运行脚本时附加cProfile。3.2.2.示例(2)-在Python中使用CProfile。3.2.3.如何解释CProfile结果?从分析结果中找出祸害更为重要。只有了解构成cProfile报告的关键要素,才能做出决定。1.:这是调用次数。2.:这是在给定函数中花费的总时间。3.除以的商。4.:执行函数及其子函数的累计时间。5.:表示除以原始调用的商。6.:程序中的操作点。它可以是一条线。或文件中某处的函数。您现在已经检查了分析报告的所有元素。因此,您可以寻找可能在代码中造成瓶颈的程序部分。首先,开始检查最重要的。有时,也可能是相关的。对于其余的项目,您需要自己练习。4.使用生成器和键进行排序。生成器是内存优化的绝佳工具。它们对于创建一次返回一个项目(迭代器)而不是一次返回所有项目的函数很有用。一个很好的例子是当您创建一个巨大的数字列表并将它们加在一起时。此外,在对列表中的项目进行排序时,应尽可能使用键和默认的方法。在下面的示例中,我们检查我们是否按照作为关键参数的一部分选择的索引对列表进行排序。同样,您可以使用字符串。5.优化循环。大多数编程语言都强调需要优化循环。在Python中,我们确实有办法使循环执行得更快。思考程序员经常错过什么的一种方法是防止在循环中使用点。在Python中,您会看到一些支持循环的构建块。在这少数人中,“for”循环的使用很普遍。虽然您可能喜欢使用循环,但它们是有代价的。Python引擎为解释for循环结构付出了巨大的努力。因此,***将它们替换为地图等内置结构。其次,代码优化的程度也取决于你对Python内置函数的了解程度。在以下示例中,我们将尝试解释不同的结构如何帮助优化循环。5.1.在Python中优化For循环的插图。示例1。让我们考虑一个更新邮政编码列表、去除尾随空格并使用for循环的函数。示例2。现在,看看如何使用地图对象将上面的内容翻译成一行。它现在也更具成本效益。示例3。我们甚至可以使用列表理解来使语法更线性。示例4。***,最快的方法是将for循环转换成生成器表达式。5.2.让我们解码我们优化的是什么?如上所述,在上述用例中(通常),使用生成器表达式是优化for循环的最快方法。我们分析了四个示例的代码,以便您还可以看到每种方法获得的性能提升。6.使用设置操作。Python使用哈希表来管理集合。每当我们向集合中添加一个元素时,Python解释器都会使用目标元素的哈希值来确定它在为集合分配的内存中的位置。由于Python会自动调整哈希表的大小,因此无论设置大小如何,速度都可以是恒定的(O(1))。这就是设置操作执行得更快的方式。在Python中,集合运算包括并集、交集和差集。所以你可以尝试在你的代码中使用它们。这些通常比遍历列表更快。7.避免使用全局变量。不仅限于Python,几乎所有语言都不允许过度或无计划地使用全局变量。这背后的原因是它们可能会导致隐藏的/不明显的副作用,从而导致意大利面条代码。另外,Python在访问外部变量时真的很慢。但是,它允许有限地使用全局变量。您可以使用global关键字声明外部变量。另外,在使用它们的内部循环之前制作一个本地副本。8.使用外部库/包。一些python库具有与原始库相同的功能的“C”等价物。用“C”编写使它们执行得更快。例如,尝试使用cPickle而不是pickle。接下来,您可以使用,这是一种针对Python的优化静态编译器。它是Python的超集,并支持C函数和类型。它指示编译器生成快速高效的代码。您也可以考虑使用PyPy包。它包括一个JIT(即时)编译器,可以使Python代码运行得更快。您甚至可以调整它以提供额外的处理能力。9.使用内置运算符。Python是一种基于高级抽象的解释型语言。所以你应该尽可能使用内置的。由于内置的??预编译和牢度,这将使您的代码更高效。包括解释步骤在内的长迭代很慢。同样,与使用地图等内置功能一样,速度也得到了显着提高。10.限制循环中的方法查找。在循环中工作时,您应该缓存方法调用而不是在对象上调用它。否则,方法查找是昂贵的。考虑以下示例。11.使用字符串进行优化。字符串连接很慢,不要在循环中进行。相反,请使用Python的join方法。或者,使用格式化函数来形成统一的字符串。Python中的RegEx操作很快被推回C代码。然而,在某些情况下,像这样的基本字符串方法工作得更好。此外,您可以使用模块来测试不同的方法。它将帮助您确定哪种方法真正最快。12.用If语句优化。像大多数编程语言一样,lazy-if求值,Python也是如此。这意味着如果添加了“AND”条件,则不会测试所有条件,以防其中一个条件变为假。1.您可以调整代码以在Python中使用此行为。例如,如果要在列表中搜索固定模式,可以通过添加以下条件来缩小范围。如果目标字符串的大小小于模式的长度,则添加一个变为假的“AND”条件。此外,您可以先测试一个快速条件(如果有的话),例如“字符串应以@开头”或“字符串应以点结尾”。2.您可以比<>更快地测试条件。likeifdoneisNoneifdone!=None总结-Python代码优化提示和技巧。我们希望本文中介绍的方法能帮助您构建更快的Python应用程序。但是,在应用这些技巧时,请注意只有在代码中建立灰色区域时才能进行优化。您可以在编码实践中直接采用一些技巧。就像使用分析方法一样,它们可以为您指明正确的方向并引领优化之路。除了上述提示之外,您还必须检查您的代码以了解次要行为。您应该了解不同Python构造(例如列表、集合和集合)的时间复杂度。***,收集尽可能多的数据,这将帮助您确定您是否在做正确的事情。