5个小技巧提升Python运行速度

Python运行速度慢?是你孤陋寡闻了?5个优化方案提速百分百 速度慢 Python之所以速度慢,主要是由于动态性和多功能性。 Python 的运行过程是虚拟机读入 Python 代码(文本),词法分析,编译成虚拟机认识的 opcode,然后虚拟机解释 opcode 执行。但这其实不是最主要的原因,Python import 之后会缓存编译后的 opcode,所以读入、词法分析和编译并没有占用太多的时间。 那么真正的慢的是哪一步分呢?就是后面的虚拟机解释 opcode 执行的部分。前期的编译是将 Python 代码编译成解释器可以理解的中间代码,解释器再将中间 阅读详情

Python 是世界上使用最广泛的编程语言之一,但在速度上还有一个非常大的缺点。好在可以通过一些小技巧提升运行速度!

Python 是世界上使用最广泛的编程语言之一。它是一种解释型高级通用编程语言,具有广泛的用途,几乎可以将其用于所有事物。其以简单的语法、优雅的代码和丰富的第三方库而闻名。python除了有很多优点外,但在速度上还有一个非常大的缺点。

虽然Python代码运行缓慢,但可以通过下面分享的5个小技巧提升Python运行速度!

首先,定义一个计时函数timeshow,通过简单的装饰,可以打印指定函数的运行时间。

这个函数在下面的例子中会被多次使用。

def timeshow(func):
    from time import time
    def newfunc(*arg, **kw):
        t1 = time()
        res = func(*arg, **kw)
        t2 = time()
        print(f"{func.__name__: >10} : {t2-t1:.6f} sec")
        return res
    return newfunc

@timeshow
def test_it():
    print("hello pytip")

test_it()   

1. 选择合适的数据结构

使用正确的数据结构对python脚本的运行时间有显着影响。Python 有四种内置的数据结构:

  • 列表: List

  • 元组: Tuple

  • 集合: Set

  • 字典: Dictionary

但是,大多数开发人员在所有情况下都使用列表。这是不正确的做法,应该根据任务使用合适数据结构。

运行下面的代码,可以看到元组执行简单检索操作的速度比列表快。其中dis模块反汇编了一个函数的字节码,这有利于查看列表和元组之间的区别。

import dis
def a():
    data = [1, 2, 3, 4, 5,6,7,8,9,10]
    x =data[5]
    return x
def b():
    data = (1, 2, 3, 4, 5,6,7,8,9,10)
    x =data[5]
    return x

print("-----:使用列表的机器码:------")
dis.dis(a)
print("-----:使用元组的机器码:------")
dis.dis(b)

运行输出:

    -----:使用列表的机器码:------
      3           0 LOAD_CONST               1 (1)
                  2 LOAD_CONST               2 (2)
                  4 LOAD_CONST               3 (3)
                  6 LOAD_CONST               4 (4)
                  8 LOAD_CONST               5 (5)
                 10 LOAD_CONST               6 (6)
                 12 LOAD_CONST               7 (7)
                 14 LOAD_CONST               8 (8)
                 16 LOAD_CONST               9 (9)
                 18 LOAD_CONST              10 (10)
                 20 BUILD_LIST              10
                 22 STORE_FAST               0 (data)
    
      4          24 LOAD_FAST                0 (data)
                 26 LOAD_CONST               5 (5)
                 28 BINARY_SUBSCR
                 30 STORE_FAST               1 (x)
    
      5          32 LOAD_FAST                1 (x)
                 34 RETURN_VALUE
    -----:使用元组的机器码:------
      7           0 LOAD_CONST               1 ((1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
                  2 STORE_FAST               0 (data)
    
      8           4 LOAD_FAST                0 (data)
                  6 LOAD_CONST               2 (5)
                  8 BINARY_SUBSCR
                 10 STORE_FAST               1 (x)
    
      9          12 LOAD_FAST                1 (x)
                 14 RETURN_VALUE

看下列表的机器码,冗长而多余!

2. 善用强大的内置函数和第三方库

如果你正在使用python并且仍在自己编写一些通用函数(比如加法、减法),那么是在侮辱python。Python有大量的库和内置函数来帮助你不用编写这些函数。如果研究下,那么你会惊奇地发现几乎90%的问题已经有第三方包或内置函数来解决。

可以通过访问官方文档查看所有内置函数。你也可以在wiki python上找到更多使用内置函数的场景。

比如,现在我们想合并列表中的所有单词为一个句子,比较法自己编写和调用库函数的区别:

# ❌ 正常人能想到的方法
@timeshow
def f1(list):
    s =""
    for substring in list:
        s += substring
    return s

# ✅ pythonic 的方法
@timeshow
def f2(list):
    s = "".join(list)
    return s


l = ["I", "Love", "Python"] * 1000 # 为了看到差异,我们把这个列表放大了
f1(l)
f2(l)

运行输出:

        f1 : 0.000227 sec
        f2 : 0.000031 sec

3. 少用循环

  • 用 列表推导式 代替循环

  • 用 迭代器 代替循环

  • 用 filter() 代替循环

  • 减少循环次数,精确控制,不浪费CPU

## 返回n以内的可以被7整除的所有数字。

# ❌ 正常人能想到的方法:
@timeshow
def f_loop(n): 
    L=[]
    for i in range(n):
        if i % 7 ==0:
            L.append(i)
    return L


#  ✅ 列表推导式
@timeshow
def f_list(n):
    L = [i for i in range(n) if i % 7 == 0]
    return L

# ✅  迭代器
@timeshow
def f_iter(n):
    L = (i for i in range(n) if i % 7 == 0)
    return L

# ✅ 过滤器 
@timeshow
def f_filter(n):
    L = filter(lambda x: x % 7 == 0, range(n))
    return L

# ✅ 精确控制循环次数 
@timeshow
def f_mind(n):
    L = (i*7 for i in range(n//7))
    return L

n = 1_000_000
f_loop(n)
f_list(n)
f_iter(n)
f_filter(n)
f_mind(n)  

输出为:

       f_loop : 0.083017 sec
    f_list : 0.056110 sec
    f_iter : 0.000015 sec
  f_filter : 0.000003 sec
    f_mind : 0.000002 sec

谁快谁慢,一眼便知!

filter 配合lambda大法就是屌!!!

4. 避免循环重复计算

如果你有一个迭代器,必须用它的元素做一些耗时计算,比如匹配正则表达式。你应该将正则表达式模式定义在循环之外,因为最好只编译一次模式,而不是在循环的每次迭代中一次又一次地编译它。

只要有可能,就应该尝试在循环外进行尽可能多的运算,比如将函数计算分配给局部变量,然后在函数中使用它。

# ❌ 应改避免的方式:
@timeshow
def f_more(s):
    import re
    for i in s:
        m = re.search(r'a*[a-z]?c', i)


# ✅ 更好的方式:
@timeshow
def f_less(s):
    import re
    regex = re.compile(r'a*[a-z]?c')
    for i in s:
        m = regex.search(i)
s = ["abctestabc"] * 1_000
f_more(s)
f_less(s)

输出为:

    f_more : 0.001068 sec
    f_less : 0.000365 sec

5. 少用内存、少用全局变量

内存占用是指程序运行时使用的内存量。为了让Python代码运行得更快,应该减少程序的内存使用量,即尽量减少变量或对象的数量。

Python 访问局部变量比全局变量更有效。在有必要之前,应该始终尝试忽略声明全局变量。一个在程序中定义过的全局变量会一直存在,直到整个程序编译完成,所以它一直占据着内存空间。另一方面,局部变量访问更快,且函数完成后即可回收。因此,使用多个局部变量比使用全局变量会更好。

# ❌ 应该避免的方式:

message = "Line1\n"
message += "Line2\n"
message += "Line3\n"

# ✅ 更好的方式:

l = ["Line1","Line2","Line3"]
message = '\n'.join(l)


# ❌ 应该避免的方式:

x = 5
y = 6 
def add():
    return x+y
add()

# ✅ 更好的方式:

def add():
    x = 5
    y = 6
    return x+y
add()

学习资源推荐

除了上述分享,如果你也喜欢编程,想通过学习Python获取更高薪资,这里给大家分享一份Python学习资料。

这里给大家展示一下我进的兼职群和最近接单的截图

兼职群

私单

😝朋友们如果有需要的话,可以点击下方链接领取或者V扫描下方二维码联系领取,也可以内推兼职群哦~

🎁 优快云大礼包,二维码失效时,点击这里领取👉:【学习资料合集&相关工具&PyCharm永久使用版获取方式】

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

1.Python学习路线

image-20230619144606466

python学习路线图1

2.Python基础学习

01.开发工具

02.学习笔记

在这里插入图片描述

03.学习视频

在这里插入图片描述

3.Python小白必备手册

图片

4.数据分析全套资源

在这里插入图片描述

5.Python面试集锦

01.面试资料

在这里插入图片描述

在这里插入图片描述

02.简历模板

在这里插入图片描述

🎁 优快云大礼包,二维码失效时,点击这里领取👉:【学习资料合集&相关工具&PyCharm永久使用版获取方式】

因篇幅有限,仅展示部分资料,添加上方即可获取👆

------ 🙇‍♂️ 本文转自网络,如有侵权,请联系删除 🙇‍♂️ ------
如何解决Python性能慢的问题? Python的性能慢是一个相对的问题,通过合理的优化,我们往往能够在满足性能需求的同时,保持Python代码简洁易读的优点。优化的方法有很多,包括代码层面的优化、并行计算、使用高效库、使用JIT编译器、使用C扩展等。在实际开发中,我们需要根据具体的场景和需求,选择合适的优化方法。同时,我们也需要注意,优化是一个持续的过程,需要不断地评估和调整。最重要的是,我们要在优化性能的同时,保持代码的可维护性和可读性,以实现长期的可持续发展。 阅读详情

相关推荐

ubuntu18.04安装gtsam过程及报错error: invalid initialization of reference of type ‘const std::vector<bool>&’

这里建议从这个链接下,不要从官网下,可能会有版本冲突 2.安装依赖 3.编译 报错: 1. error: invalid initialization of reference of type ‘const std::vector&’ from expression of type ‘const std::vector’ 124 | const std::vector& mask() const { retur...

qq_35102059的博客 2912

6个技巧帮你提高Python运行效率

随着国内对人工智能领域发展的大力支持,Python编程语言成为国内使用增长率的最大的编程语言。越来越多的人加入Python的学习行列,企业对Python的使用也越来越普遍。Python能够让你在端时间内通过少量代码,实现大量的操作。这里小编整理了6个Python编程技巧,帮你提高Python的运行效率。

2201_75362610的博客 4604

密码学:一文读懂数字证书

消息摘要算法用于验证数据完整性服务,对称加密算法和非对称加密算法用于保证数据保密性服务,数字签名算法用于抗否认性服务。数字证书集合了多种密码学算法:自身带有公钥信息,可完成相应的加密/解密操作;同时,还带有数字签名,可鉴别消息来源;且自身带有消息摘要信息,可验证证书的完整性;由于证书本身含有用户身份信息,因而具有认证性。

Shujie 2910

Python运行速度慢?5个优化方案提速100%!

Python运行速度慢?5个优化方案提速100%!不信你试试

python03012的博客 4830

Acer宏碁暗影骑士擎AN515-58原厂系统恢复指南:从ISO镜像到完整出厂设置

本文详细介绍了为Acer宏碁暗影骑士擎AN515-58游戏本恢复原厂系统的完整指南。从准备工作、数据备份到下载官方镜像、制作恢复U盘,再到BIOS设置与恢复流程,一步步教你如何将系统完整还原至出厂状态,确保所有硬件驱动、NITROSENSE控制中心等专属优化功能恢复正常,解决系统卡顿、功能异常等问题。

weixin_29271263的博客 1099

Vue3 + EventSource 实战:手把手教你打造实时AI聊天悬浮窗(附完整代码)

本文详细介绍了如何使用Vue3和EventSource技术构建一个实时AI聊天悬浮窗。文章从产品化视角出发,重点讲解了流式数据接收与渲染、悬浮窗UI交互的工程化实现、性能优化及高级功能,并提供了完整的代码示例,帮助开发者快速集成功能完整的AI问答系统。

assembly8low的博客 845

这8种Python加速运行技巧真棒

其会预分配一定内存空间,当预分配的内存空间用完,又继续向其中添加元素时,会申请一块更大的内存空间,然后将原有的所有元素都复制过去,之后销毁之前的内存空间,再插入新元素。如果你的代码运行速度很慢,首先要找到代码运行慢的位置,通常是内部循环,专注于运行慢的地方进行优化。Python 内置的数据结构如 str , tuple , list , set , dict 底层都是 C 实现的,速度非常快,自己实现新的数据结构想在性能上达到内置的速度几乎是不可能的。优化是有代价的,想解决所有性能的问题是几乎不可能的。

Python专栏 2714

小黄鸭机器人技术全解-第 07 章 关节自由度与行程参数

—鸭子歪着头转头时,转的平面是斜的,这正是它"灵动"感的来源。仿真里这是自动的(轴定义在父刚体系),复刻时不需要做任何事——

yolo模型训练找我,AI游戏合作找我 67

5个小技巧提升Python运行速度_python运行加速脚本

① 2000多本Python电子书(主流和经典的书籍应该都有了)② Python标准库资料(最全中文版)③ 项目源码(四五十个有趣且经典的练手项目及源码)④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)⑤ Python学习路线图(告别不入流的学习)

2401_84538884的博客 1058

uniapp(vue3)- 详解安装/使用pinia报错reportJSException >>>> exception function:createInstanceContext, excepti

uniapp vue3 pinia报错reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack -> at useStore,H5网页,微信小程序,安卓App,苹果App,nvue,uniapp安装使用pinia出现报错at useStore,uniapp+vue3+ts 使用pinia报

🏆 前端领域优质创作者 4048

手把手带你完成基于UNet的医学图像分割系统设计与实现,UNet网络架构讲解,UNet复现,使用vibe coding工具,开发一个完整系统,包含完整源码

哈喽,大家好,这里是落花不写码,本次教程讲一下 U-Net 分割篇,U-Net 它是一篇 2015 年发表的论文,那为什么到现在还需要讲呢?因为后续讲到 GAN、扩散模型时候是离不开 U-Net 架构的,所以今天先带大家使用 U-Net 模型完成一些图像分割。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 870

5个小技巧提升Python运行速度_python运行加速脚本(1)

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。工具都帮大家整理好了,安装就可直接上手!当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

2401_84538884的博客 759

【WRF-UCM】BEP+BEM 模拟:README

【WRF-UCM】BEP+BEM 模拟:README

WW、forever的博客 223

10个优化Python代码的小技巧,使代码运行速度提升5倍!

Python优化指南:让代码运行速度提高5倍。

weixin_39915649的博客 3519

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

最新5个小技巧提升Python运行速度_python运行加速脚本,2024年最新计算机网络面试常见问题

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~给大家准备的学习资料包括但不限于:Python 环境、pycharm编辑器/永久激活/翻译插件python 零基础视频教程Python 界面开发实战教程Python 爬虫实战教程Python 数据分析实战教程python 游戏开发实战教程Python 电子书100本。

m0_60607895的博客 1016

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Python学习之路(十四)优化py文件运行速度

在写完一个脚本文件之后,会在不同的工程之中进行调用,这就会造成因为脚本的运行效率不高,反复读写文件等,导致了整个工程的运行效率很低,在无休止的等待程序运行的时间里浪费了大量的工作时间,所以说优化运行速度是非常关键的一点,下面就一起来了解一下如何去进行优化。Python查看程序运行时间: 优化程序的效率:​​​​​​python运行速度慢?那是你不会正确使用python_天天开心学编程的博客-优快云博客_脚本运行速度慢5个小技巧提升Python运行速度_pythontip的博客-优快云博客_pytho

qq_43681154的博客 567

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

提高Python运行速度的小技巧

虽然导入模块有时候是必不可少的,但是其实导入模块也是需要花费时间的,当我们在制作模块而需要被其它模块导入时,由于被导入模块通常最上方导入了该模块其它函数或类的依赖模块,于是在被其它模块导入时,某些不必要的模块也会被导入。在一些特殊场景中,我们不必傻乎乎的利用循环进行计算,尝试使用公式计算对于速度的提升将是飞越性的。一个比较好的解决方案是使用f-Strings,通过f-strings拼接可以自动将其他类型转换成字符串类型,并且速度要比‘+’拼接快。我们可以使用列表推导式生成我们想要的列表、元组,甚至字典等。

2501_92499985的博客 942

[Python] 提高Python运行速度(小技巧)

虽然导入模块有时候是必不可少的,但是其实导入模块也是需要花费时间的,当我们在制作模块而需要被其它模块导入时,由于被导入模块通常最上方导入了该模块其它函数或类的依赖模块,于是在被其它模块导入时,某些不必要的模块也会被导入。在一些特殊场景中,我们不必傻乎乎的利用循环进行计算,尝试使用公式计算对于速度的提升将是飞越性的。一个比较好的解决方案是使用f-Strings,通过f-strings拼接可以自动将其他类型转换成字符串类型,并且速度要比‘+’拼接快。我们可以使用列表推导式生成我们想要的列表、元组,甚至字典等。

知智 5323
上一篇: 网络安全是什么?一文认识网络安全
下一篇: 明明白白安装Python解释器(多版本共存切换)、Python IDE:PyCharm(专业版永久)透彻!
AI大模型学习
博客等级 码龄4年 2471粉丝 620原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值