iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >有哪些Python加速技能
  • 604
分享到

有哪些Python加速技能

2023-06-16 10:06:07 604人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要讲解了“有哪些python加速技能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些Python加速技能”吧!1. 避免使用全局变量import mathsize&n

这篇文章主要讲解了“有哪些python加速技能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些Python加速技能”吧!

1. 避免使用全局变量

import mathsize = 10000 for x in range(size):     for y in range(size):         z = math.sqrt(x) + math.sqrt(y)

许多程序员一开始都会用Python语言编写一些简单的脚本。编写脚本时,通常直接使用全局变量,就像上面这段代码。

但由于全局变量和局部变量的实现方式不同,全局变量中定义的代码要比在函数中定义的函数运行起来慢得多。把脚本语句放入函数中,通常运行速度可提高15%-30%。如下所示:

import mathdef main():     size = 10000     for x in range(size):         for y in range(size):             z = math.sqrt(x) +math.sqrt(y)main()

2. 避免数据重复

避免无意义的数据复制

def main():     size = 10000     for _ in range(size):         value = range(size)         value_list = [x for x in value]         square_list = [x * x for x invalue_list]main()

这段代码中,value_list完全没有必要,这会创建不必要的数据结构或复制。

def main():     size = 10000     for _ in range(size):         value = range(size)         square_list = [x * x for x invalue]main()

另一个原因在于Python的数据共享机制过于偏执,没有很好理解或信任内存模型,例如滥用copy.deepcopy()函数。我们可以删除此类代码中的复制操作。

交换值时无需使用中间变量

def main():     size = 1000000     for _ in range(size):         a = 3         b = 5         temp = a         a = b         b = tempmain()

上述代码在交换值时创建了一个临时变量temp。如果没有中间变量,代码会更加简洁,运行速度也更快。

def main():     size = 1000000     for _ in range(size):         a = 3         b = 5         a, bb = b, amain()

使用字符串联方法join ,而不是'+'

import string from typing import Listdef concatString(string_list: List[str]) -> str:     result = ''     for str_i in string_list:         result += str_i     return resultdef main():     string_list =list(string.ascii_letters * 100)     for _ in range(10000):         result =concatString(string_list)main()

另一要点是a+b对字符串进行拼接,由于在Python中字符串是不可变的对象,所以实际上a和b分别复制到了应用程序的新内存空间中。

因此,如果拼接n个字符串会产生“ n-1”个中间结果,则每个字符串都会产生应用和复制内存所需的中间结果,从而严重影响操作效率。

在使用join()串联字符串时,首先计算需要应用的总内存空间,然后立即申请所需的内存,再把每个字符串元素复制到内存中。

import string from typing import Listdef concatString(string_list: List[str]) -> str:     return ''.join(string_list)defmain():     string_list = list(string.ascii_letters* 100)     for _ in range(10000):         result =concatString(string_list)main()

3. 避免使用以下函数属性

避免访问模块和函数属性

import mathdef computeSqrt(size:int):     result = []     for i in range(size):         result.append(math.sqrt(i))     return resultdef main():     size = 10000     for _ in range(size):         result = computeSqrt(size)main()

use(属性访问运算符)会触发特定方法,例如getattribute()和getattr(),这些方法将执行字典操作,会产生额外的时间消耗。

通过使用import语句,可以消除属性访问:

from math import sqrtdefcomputeSqrt(size: int):     result = []     for i in range(size):         result.append(sqrt(i))     return resultdef main():     size = 10000     for _ in range(size):         result = computeSqrt(size)main()

前文中我们讨论了局部变量可以比全局变量实现更快查找,对于经常访问的变量(如sqrt),可以通过更改为局部变量以加快操作速度。

import mathdef computeSqrt(size:int):     result = []     sqrt = math.sqrt     for i in range(size):         result.append(sqrt(i))     return resultdef main():     size = 10000     for _ in range(size):         result = computeSqrt(size)main()

避免类属性访问

import math from typing import Listclass DemoClass:     def __init__(self, value: int):         self._value = value         def computeSqrt(self, size: int)-> List[float]:         result = []         append = result.append         sqrt = math.sqrt         for _ in range(size):             append(sqrt(self._value))         return resultdef main():     size = 10000     for _ in range(size):         demo_instance = DemoClass(size)         result =demo_instance.computeSqrt(size)main()

避免的原理也适用于类的属性,并且访问self._value的速度要比访问局部变量的速度要慢。通过把需要频繁访问的类属性分配给局部变量,可以提高代码执行速度。

import math from typing import Listclass DemoClass:     def __init__(self, value: int):         self._value = value         def computeSqrt(self, size: int)-> List[float]:         result = []         append = result.append         sqrt = math.sqrt         value = self._value         for _ in range(size):             append(sqrt(value))         return resultdef main():     size = 10000     for _ in range(size):         demo_instance = DemoClass(size)        demo_instance.computeSqrt(size)main()

4. 避免不必要的抽象

class DemoClass:     def __init__(self, value: int):         self.value = value@property     def value(self) -> int:         return self._value@value.setter     def value(self, x: int):         self._value = xdef main():     size = 1000000     for i in range(size):         demo_instance = DemoClass(size)         value = demo_instance.value         demo_instance.value = imain()

每当使用其他处理层(例如装饰器、属性访问、描述符)封装代码时,代码运行的速度也会变慢。在大多数情况下,重新检查是否有必要使用属性访问器定义是很有必要的。

使用getter/setter函数访问属性通常是被C/C++程序员遗忘的一种编码样式。如果确实没有必要,就使用简单属性就好。

class DemoClass:     def __init__(self, value: int):         self.value = valuedef main():     size = 1000000     for i in range(size):         demo_instance = DemoClass(size)         value = demo_instance.value         demo_instance.value = imain()

5. 选择合适的数据结构

众所周知,列表是Python中的动态数组。当预分配的内存空间用完时,会预分配一定的内存空间,然后继续向其中添加元素。然后复制之前的所有原始元素,形成一个新的内存空间,在插入新元素之前销毁先前的内存空间。

因此,如果频繁添加或删除,或者添加或删除的元素数量太大,列表的效率就会变低,目前最好使用collections.deque。

此双端队列具有堆栈和队列的特性,并且可以在两端以O(1)复杂度执行插入和删除操作。

列表搜索操作非常耗时。当需要频繁查找某些元素或按顺序频繁访问这些元素时,保持列表 对象有序的情况下使用二分法,使用二进制搜索以提高搜索效率,但二进制搜索仅适用于有序元素。

另一个常见的要求是找到最小值或最大值。此时,可以使用heapq模块列出转换为堆的列表,因此获取最小值的时间复杂度为O(1)。

6. 循环优化

使用 for 循环代替while 循环

def computeSum(size: int) ->int:     sum_ = 0     i = 0     while i < size:         sum_ += i         i += 1     return sum_def main():     size = 10000     for _ in range(size):         sum_ = computeSum(size)main()

要知道,Python中的for循环要比while循环快得多。

def computeSum(size: int) ->int:     sum_ = 0     for i in range(size):         sum_ += i     return sum_def main():     size = 10000     for _ in range(size):         sum_ = computeSum(size)main()

使用隐式for循环,而不是显式for循环

对于上面的示例,可以进一步使用隐式for循环替换显式for循环

def computeSum(size: int) ->int:     return sum(range(size))def main():     size = 10000     for _ in range(size):         sum = computeSum(size)main()

减少内部循环的计算

from math import sqrtdef main():     size = 10000    for x in range(size):         for y in range(size):             z = sqrt(x) + sqrt(y)main()

在上述for循环中的代码sqrt(x)中,在训练期间每次都需要进行重新计算,这会增加时间消耗。

import mathdef main():     size = 10000for x in range(size):         sqrtsqrt_x = sqrt(x)         for y in range(size):             z = sqrt_x + sqrt(y)main()

7. 使用 numba.jit

继续遵循上述示例,并在此基础上使用numba.jit。Python函数JIT可以编译为机器代码用以执行,这能大大提高了代码执行速度。

import numba@numba.jit def computeSum(size: float) -> int:     sum = 0     for i in range(size):         sum += i     return sumdef main():     size = 10000     for _ in range(size):         sum = computeSum(size)main()

8. 代码优化原则

第一个基本原则就是不要过早优化代码。

许多人一开始编写代码时就致力于性能优化,“加快正确程序的速度要比确保快速程序的正确运作容易得多。”优化代码的前提是确保代码可以正常工作。过早的优化可能会忽略对总体性能指标的掌握,并且在获得总体结果之前不要颠倒顺序。

第二个基本原则是权衡优化代码的成本。

优化代码是有代价的,想要解决所有性能问题几乎不可能。通常面临的选择是时间换空间或空间换时间,还需要考虑开发成本。

第三个原则是不要优化无关紧要的部分。

如果优化代码的每个部分后,这些变更会让代码变得难以阅读和理解。如果代码运行缓慢,首先必须找到代码运行缓慢的位置(通常是内部循环),重点优化代码运行缓慢的地方。对于其他位置,时间的损失影响很小。

感谢各位的阅读,以上就是“有哪些Python加速技能”的内容了,经过本文的学习后,相信大家对有哪些Python加速技能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 有哪些Python加速技能

本文链接: https://www.lsjlt.com/news/283193.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 有哪些Python加速技能
    这篇文章主要讲解了“有哪些Python加速技能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些Python加速技能”吧!1. 避免使用全局变量import mathsize&n...
    99+
    2023-06-16
  • Python并行加速的技巧有哪些
    本篇内容介绍了“Python并行加速的技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 前言我们在日常使用Python进行各种数据...
    99+
    2023-06-30
  • 加速Python编程的小技巧有哪些
    本篇内容主要讲解“加速Python编程的小技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“加速Python编程的小技巧有哪些”吧!1.负索引人们喜欢使用序列,因为当我们知道元素的顺序,我...
    99+
    2023-06-15
  • win7电脑加速技巧有哪些
    这篇文章将为大家详细讲解有关win7电脑加速技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。定期清理缓存和垃圾日常生活中,我们会在电脑上追剧,逛淘宝,浏览网页,打游戏等等,这些操作都会在后台留下许...
    99+
    2023-06-27
  • ssl加速技术有哪些优势
    ssl加速技术的优势有:1、安全性高,能保证网络上数据传输的安全性;2、支持各种应用层协议,能为任何基于TCP等可靠连接的应用层协议...
    99+
    2023-02-16
    ssl加速 ssl
  • 国内cdn加速技术有哪些
    国内cdn加速技术有:1、内容发布,借助于建立索引、缓存、流分裂、组播等技术;2、内容路由,能让用户请求得到最近内容源的响应;3、内容交换,利用应用层交换、流分裂、重定向等技术,智能地平衡负载流量;4、性能管理,能保证网络处于最佳的运行状态...
    99+
    2024-04-02
  • win7优化加速技巧有哪些
    本篇内容介绍了“win7优化加速技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!win7优化加速技巧介绍方法一:首先使用“win+r...
    99+
    2023-07-01
  • 加快Python运行时速度的技巧有哪些
    本篇内容介绍了“加快Python运行时速度的技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!0.优化原理在深入探讨代码优化的细节之前...
    99+
    2023-06-16
  • win7启动加速的技巧有哪些
    这篇文章主要介绍了win7启动加速的技巧有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win7启动加速的技巧有哪些文章都会有所收获,下面我们一起来看看吧。一、删除多余的字体Windows 7中默认安装了不...
    99+
    2023-06-27
  • cdn加速技术的作用有哪些
    1. 提高网站访问速度:CDN加速技术可以将网站的静态资源分布到全球各地的CDN节点,避免了用户请求时跨越长距离的网络传输,从而提高...
    99+
    2023-06-13
    cdn加速技术 cdn
  • cdn加速服务器有哪些技术
    cdn加速服务器的技术有:1、内容发布技术,借助于建立索引、缓存、流分裂、组播等技术;2、内容路由技术,能让用户请求得到最近内容源的响应;3、内容交换技术,利用应用层交换、流分裂、重定向等技术,智能地平衡负载流量;4、性能管理技术,能保证网...
    99+
    2024-04-02
  • cdn网站加速功能有哪些
    1. 静态资源缓存:将静态资源缓存在CDN节点上,减少源站的压力,加快访问速度。2. 动态资源加速:CDN可以通过缓存动态页面的结果...
    99+
    2023-06-05
    cdn网站加速 cdn
  • 加速Python数据分析的小技巧分别有哪些
    这期内容当中小编将会给大家带来有关加速Python数据分析的小技巧分别有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。有时候,一点小小的黑客行为可以节省时间,挽救生命。一个小小的快捷方式或附加组件有时...
    99+
    2023-06-16
  • 5个python提速技巧有哪些
    5个python提速技巧有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、跳过迭代对象的开头string_from_file = "&q...
    99+
    2023-06-22
  • 免备案的cdn有哪些加速技术
    免备案cdn的加速技术有:1、内容发布,借助于建立索引、缓存、流分裂、组播等技术;2、内容路由,能让用户请求得到最近内容源的响应;3、内容交换,利用应用层交换、流分裂、重定向等技术,智能地平衡负载流量;4、性能管理,能保证网络处于最佳的运行...
    99+
    2024-04-02
  • cdn网站加速的功能有哪些
    CDN网站加速的功能有以下几点:1. 加速网站访问速度:CDN可以将网站的静态资源缓存到全球各地的服务器上,当用户访问网站时,可以从...
    99+
    2023-06-08
    cdn网站加速 cdn
  • 服务器cdn加速技术有哪些优势
    服务器CDN加速技术有以下几个优势:1. 提升网站访问速度:CDN可以将网站内容分发到全球多个节点服务器上,用户通过就近节点服务器访...
    99+
    2023-09-16
    服务器 cdn加速
  • 国内免备案cdn加速技术有哪些
    国内免备案cdn加速技术有:1、内容发布,借助于建立索引、缓存、流分裂、组播等技术;2、内容路由,能让用户请求得到最近内容源的响应;3、内容交换,利用应用层交换、流分裂、重定向等技术,智能地平衡负载流量;4、性能管理,能保证网络处于最佳的运...
    99+
    2024-04-02
  • windows中IE8浏览器加速技巧有哪些
    今天就跟大家聊聊有关windows中IE8浏览器加速技巧有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。至于加速器的图标文件可以访问X:\Users\用户名\AppData\Lo...
    99+
    2023-06-14
  • 重要的Python技能有哪些
    这篇文章主要讲解了“重要的Python技能有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“重要的Python技能有哪些”吧!1、拉姆达函数(Lambda Functions)拉姆达函数非...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作