中国领先的IT技术网站
|
|

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

Python是一种强大的编程语言。而且我们可以做到这一点,使代码更轻更快,下面我们列出了一些最好的Python代码优化技巧和技巧。

作者:佚名来源:python蔷薇|2017-11-01 21:33

Tech Neo技术沙龙 | 11月25号,九州云/ZStack与您一起探讨云时代网络边界管理实践


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

Python是一种强大的编程语言。而且我们可以做到这一点,使代码更轻更快。它不仅支持多处理功能,而且轻松实现。下面我们列出了一些最好的Python代码优化技巧和技巧。


Python批评者有时会声称它很慢。但是这不是因为Python,而是由于用于编写代码的做法。在这篇文章中,您将找到加速您的Python应用程序的提示。

由于Python是功能丰富的语言,所以总是有改进的余地。如果您希望使您的Python代码运行得更快更有效率,那么请继续阅读。

这些技巧和Python的优点在于所有的优化技术实际上都在Python领域。你只需要知道它们,并在编码时以有纪律的方式实施。最近我们写了一篇关于三十个基本Python编程技巧和技巧的文章。你也可以检查出来,找到你不知道的东西。

我们首先从Python的一些核心内部开始,你可以利用它来获得优势。

基本的Python代码优化技巧和技巧的极客。

国际弦乐效率。

实现字符串是一种仅存储每个不同字符串的单个副本的方法。我们可以通过操作我们的代码来触发字符串的实现,使Python解释器重用字符串。

通常,当我们创建一个字符串对象时,由Python解释器决定是否缓存字符串。在处理标识符的某些条件下,它是解释器的固有本质。

声明一个字符串,其名称以字母或下划线开头,仅包含字母/下划线/数字组合,将使Python嵌入字符串并为其创建散列。

由于Python有很多使用字典的内部代码,这导致它执行no。的搜索标识符。因此,在标识符串之间实行加速整个过程。简而言之,Python将所有标识符保留在表中,并为每个对象生成唯一的密钥(散列),以便将来查找。此优化在编译期间进行。它还结合了类似于标识符的字符串文字的实习。

所以在Python中这是一个非常有用的功能,你可以利用它来获得好处。这样的功能可以帮助您加快对大型文本挖掘或分析应用程序的处理。因为他们需要频繁的搜索和触发信息的记账。

您从文件中读取或通过网络通信接收的字符串不是Python中自动实习的一部分。相反,您可以将此任务卸载到用于处理此类字符串的intern()函数。

窥视孔优化技术。

窥视孔优化是从程序或程序的一部分优化一小段指令的方法。这个段被称为<Peephole>或<Window>。它可以帮助您找到可以用最小化版本替换的说明。

我们来看看Python如何处理窥视孔优化。它有一个内置的方法,从下面的例子中查看。

实施例-1。

该示例具有初始化其两个成员的功能。其中一个是字符串,而另一个是整数。接下来的另一个代码属性被添加到函数中,并且默认为<无>。有趣的是四个文字将作为常数留在记忆中。请参考下面给出的图像。python中的优化,大神的程序比我们写的快五倍,原来是这样做的!

Python代码优化提示和技巧 - 示例(1)

在附加的快照中,您可以看到我们使用了常量<.__代码__。co_consts>。它是Python中每个功能对象的三个元组之一。是的,一个函数也是Python中的一个对象。它包括以下三个元组。

1. <__ code __。co_varnames>:保存包含参数的局部变量。

2. <__ code __。co_names>:存储全局文字。

3. <__ code __。co_consts>:引用所有常量。

现在,窥探孔优化可以做的更多,就是把可变结构变成不可变的。参考下面的例子。

例2。

在这个例子中,我们使用“in”运算符搜索集合中的一个特定元素。这里,Python会检测到该集合将用于验证元素的成员资格。因此,无论集合的大小如何,它都会将指令视为不变成本操作。并且将比在元组或列表的情况下更快地处理它们。这种方法被称为Python中的成员身份测试。请仔细检查附件的截图。

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

Python代码优化提示和技巧 - 示例(2)

实施例-3。

尽管如此,如果您以与上一个示例中的集合相似的方式使用列表对象,则Python将其转换为元组常量。现在,在这个例子中,我们已经将这个集合和列表的用法结合在一起了。并显示两个对象都被转换成常量。请参考附件截图。

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

Python代码优化技巧与窍门 - 示例(3)

同样的事实,我们可以验证看翻译代码的字节码。为此,我们必须导入Python的“dis”模块。并将函数对象作为参数传递给“dis”构造函数,将按字节码打印整个内存布局。

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

Python代码优化提示和技巧 - 示例(4)

从附件图像中的“dis”输出,很容易验证集合和列表是否已经变为常量。

这里的主旨是Python只对文字进行了这种转换。如果上述示例中使用的任何set / list不是文字,那么优化就不会发生。

配置你的代码

在进一步深入优化您的代码之前,如果您不知道瓶颈在哪里,那将是天真的。所以首先,使用下面提到的两种方法中的任何一种来配置你的代码。

3.1。使用<Timeit>进行秒表分析。

这是使用Python的<timeit>模块进行分析的传统方式。它记录代码段执行的时间。它测量以毫秒为单位的时间。

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

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

上面的例子表明,join方法比其他方法更有效率。

3.2。使用<CProfile>进行高级分析。

从Python 2.5开始,cProfile是Python包的一部分。它提供了一组不错的分析功能来隔离代码中的瓶颈。你可以用许多方式与你的代码绑定。喜欢,在其运行方法中包装一个函数来测量性能。或者,在Python的“-m”选项的帮助下,通过命令行运行整个脚本,同时激活cProfile作为参数。

在这里,我们将展示一些基本的例子,以便您了解如何使用它。

3.2.1。示例(1) - 在Python中使用CProfile。

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

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

查看结果,您可以调查有待改进的领域。更有用的是,我们可以在运行脚本时附加cProfile。

3.2.2。示例(2) - 在Python中使用CProfile。

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

3.2.3。如何解释CProfile结果?

从分析结果中找出祸患更为重要。只有知道构成cProfile报告的关键要素,才能作出决定。

1. <ncalls>:这是调用的次数。

2. <tottime>:这是在给定函数中花费的总时间。

3. <percall>:表示<tottime>除以<ncalls>的商。

4. <cumtime>:执行函数及其子功能的累积时间。

5. <percall>:表示<cumtime>除以原始调用的商。

6. <filename_lineno(function)>:程序中的操作点。这可能是一条线。或文件中某个位置的函数。

现在,您已经检查了所有分析报告的元素。所以你可以去寻找程序的可能部分,在代码中创建瓶颈。

首先,开始检查最重要的<tottime>和<cumtime>。有时候,<ncalls>也可能是相关的。对于其余的项目,您需要自己练习。

4.使用发电机和钥匙进行排序。

发电机是内存优化的好工具。它们有助于创建一次可以返回一个项目(迭代器)的函数,而不是一次返回所有的项目。一个很好的例子是当你创建一个巨大的数字列表,并将它们相加在一起。

此外,在列表中排序项目时,应尽可能使用键和默认的<sort()>方法。在下面的示例中,检查我们是否按照作为键参数的一部分选择的索引对列表进行排序。同样的方法,你可以使用字符串。

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

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

5.优化循环。

大多数编程语言强调需要优化循环。在Python中,我们确实有一种使循环执行得更快的方法。考虑程序员经常错过的方法是阻止在循环中使用点。

在Python中,您会看到一些支持循环的构建块。在这些少数中,使用“for”循环是普遍的。虽然你可能喜欢使用循环,但是他们来代价。Python引擎在解释for循环构造方面付出了巨大的努力。因此,最好用内置的结构(如地图)替换它们。

接下来,代码优化的水平也取决于你对Python内置功能的了解。在下面的例子中,我们将尝试解释不同的构造如何帮助优化循环。

5.1。用于优化Python中For循环的插图。

实施例-1。

让我们考虑一个更新Zipcodes列表的功能,剥离尾随空格,并使用for循环。

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

例2。

现在,看看如何使用地图对象将上述内容翻译成单行。现在也更具成本效益。

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

实施例-3。

我们甚至可以使用列表推导使语法更线性化。

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

实施例-4。

最后,最快的方法是将for循环转换为生成器表达式。

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

5.2。让我们解码我们优化了什么?

如上所述,使用生成器表达式是在上述用例(通常)中优化for循环的最快方法。我们分析了四个示例的代码,以便您也可以看到每种方法获得的性能提升。

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

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

6.使用设置操作。

Python使用哈希表来管理集合。每当我们向一个集合添加一个元素时,Python解释器将使用目标元素的散列来确定其在为集合分配的内存中的位置。

由于Python自动调整散列表的大小,所以无论设置的大小如何,速度都可以是常数(O(1))。这就是集合操作执行得更快。

在Python中,设置操作包括联合,交集和差异。所以你可以尝试在你的代码中使用它们。这些通常比迭代列表快。

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

7.避免使用全局变量。

它不仅限于Python,几乎所有的语言都不允许使用全局变量的过度或计划外使用。背后的原因是他们可能会隐藏/不明显的副作用导致意大利面条代码。此外,Python在访问外部变量方面真的很慢。

然而,它允许有限地使用全局变量。您可以使用global关键字声明一个外部变量。另外,在使用它们的内部循环之前做一个本地的副本。

8.使用外部库/包。

一些python库具有与原始库相同特征的“C”等价物。被写入“C”使它们执行速度更快。例如,尝试使用cPickle而不是使用pickle。

接下来,您可以使用<Cython>,这是Python的优化静态编译器。它是Python的超集,并带来C函数和类型的支持。它指示编译器生成快速高效的代码。

您也可以考虑使用PyPy软件包。它包括一个JIT(即时)编译器,使Python代码运行速度快。你甚至可以调整它来提供额外的处理能力。

9.使用内置操作符。

Python是一种解释型语言,基于高级抽象。所以你应该尽可能使用内置的。这将使您的代码更有效率,因为内置的预编译和快速。而包括解释步骤在内的漫长迭代很慢。

同样,喜欢使用内置功能,如地图,显着改善速度。

10.在循环中限制方法查找。

在循环中工作时,应该缓存方法调用,而不是在对象上调用它。否则,方法查找是昂贵的。

请考虑以下示例。

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

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

11.使用字符串进行优化。

字符串连接缓慢,不要在循环中执行。而是使用Python的join方法。或者,使用格式化功能来形成一个统一的字符串。

Python中的RegEx操作很快就被推回到C代码。然而,在某些情况下,基本的字符串方法(如<isalpha()/ isdigit()/ startswith()/ endswith()>更好地工作。

此外,您可以使用<timeit>模块测试不同的方法。它将帮助您确定哪种方法是真正最快的。

12.用If语句进行优化。

像大多数编程语言一样,懒惰 - 如果评估,Python也是如此。这意味着,如果加入“AND”条件,那么并非所有条件都将被测试,以防其中一个变为假。

1.你可以调整你的代码使用Python的这种行为。例如,如果要在列表中搜索固定模式,则可以通过添加以下条件来减小范围。

如果目标字符串的大小小于模式的长度,则添加一个“AND”条件,该条件变为false。

此外,您可以首先测试一个快速条件(如果有的话),如“string应该以@开头”或“string应该以点结尾”。

2.您可以测试比< > 更快的条件< not >。like ifdoneis None ifdone!=None

摘要 - Python代码优化提示和技巧。

我们希望本文中给出的方法可以帮助您构建更快的Python应用程序。但是,在应用这些提示时,请注意,只有在您的代码中建立了灰色区域时,才能进行优化。

您可以直接在编码实践中采用一些提示。就像使用剖析方法一样,它们是给您正确的方向,并引导优化的道路。

除了上述提示之外,您必须检查代码以进行二次行为。您应该了解不同Python构造的时间复杂性,如列表,集合和集合。最后,尽可能收集数据,这将有助于您确定您正在做的是否对。

【编辑推荐】

  1. 谷歌发布新项目,旨在将Python代码编译为Go
  2. 面向Python语言的三大顶级机器学习库
  3. Python对Ruby:谁在Web开发领域更胜一筹?
  4. 外媒速递:三大顶尖开源Python IDE方案综述
  5. 外媒速递:你值得一试的三款开源Python GUI框架
【责任编辑:张燕妮 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Java程序设计专家门诊

精选目前国内外最流行的程序设计语言——Java作为本书的选题,并以丰富的内容来解决读者学习该语言时可能遇到的各种问题。以专业的论坛为基...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
× CTO训练营(深圳站)