9 个让你的 Python 代码更快的小技巧

实用教程:10个提高Python编程效率的技巧 由于文章篇幅有限,文档资料内容较多,需要这些文档的朋友,可以加小助手微信免费获取,【保证100%免费】,中国人不骗中国人。 阅读详情

我们经常听到 “Python 太慢了”,“Python 性能不行”这样的观点。但是,只要掌握一些编程技巧,就能大幅提升 Python 的运行速度。

今天就让我们一起来看下让 Python 性能更高的 9 个小技巧

字符串拼接的技巧

如果有大量字符串等待处理,字符串连接将成为 Python 的瓶颈。

一般来讲,Python 中有两种字符串拼接方式:

  • 使用该 join() 函数将字符串列表合并为一个字符串
  • 使用 + or += 符号将每个字符串加成一个

那么哪种方式更快呢?我们一起来看一下

mylist = ["Yang", "Zhou", "is", "writing"]
​
​
# Using '+'
def concat_plus():
    result = ""
    for word in mylist:
        result += word + " "
    return result
​
​
# Using 'join()'
def concat_join():
    return " ".join(mylist)
​
​
# Directly concatenation without the list
def concat_directly():
    return "Yang" + "Zhou" + "is" + "writing"

import timeit
​
print(timeit.timeit(concat_plus, number=10000))
# 0.002738415962085128
print(timeit.timeit(concat_join, number=10000))
# 0.0008482920238748193
print(timeit.timeit(concat_directly, number=10000))
# 0.00021425005979835987

如上所示,对于拼接字符串列表, join() 方法比在 for 循环中逐个添加字符串更快。

原因很简单。一方面,字符串是 Python 中的不可变数据,每个 += 操作都会导致创建一个新字符串并复制旧字符串,这会导致非常大的开销。

另一方面,.join() 方法是专门为连接字符串序列而优化的。它预先计算结果字符串的大小,然后一次性构建它。因此,它避免了与循环中 += 操作相关的开销,因此速度更快。

但是,我们发现最快其实是直接用 + 拼接字符串,这是因为:

  • Python 解释器可以在编译时优化字符串的连接,将它们转换为单个字符串。因为没有循环迭代或函数调用,所以它是一个非常高效的操作。
  • 由于所有字符串在编译时都是已知的,因此 Python 可以非常快速地执行此操作,比循环中的运行时连接甚至优化 .join() 方法快得多。

总之,如果需要拼接字符串列表,请选择 join() ;如果直接拼接字符串,只需使用 + 即可。

创建列表的技巧

Python 中创建列表的两种常见方法是:

  • 使用函数 list()
  • [] 直接使用

我们来看下这两种方法的性能

import timeit
​
print(timeit.timeit('[]', number=10 ** 7))
# 0.1368238340364769
print(timeit.timeit(list, number=10 ** 7))
# 0.2958830420393497

结果表明,执行 list() 函数比直接使用 [] 要慢。

这是因为 是 [] 字面语法( literal syntax ),而 list() 是构造函数调用。毫无疑问,调用函数需要额外的时间。

同理,在创建字典时,我们也应该利用 {} 而不是 dict()

成员关系测试的技巧

成员关系测试的性能很大程度上取决于底层数据结构

import timeit
​
large_dataset = range(100000)
search_element = 2077
​
large_list = list(large_dataset)
large_set = set(large_dataset)
​
​
def list_membership_test():
    return search_element in large_list
​
​
def set_membership_test():
    return search_element in large_set
​
​
print(timeit.timeit(list_membership_test, number=1000))
# 0.01112208398990333
print(timeit.timeit(set_membership_test, number=1000))
# 3.27499583363533e-05

如上面的代码所示,集合中的成员关系测试比列表中的成员关系测试要快得多。

这是为什么呢?

  • 在 Python 列表中,成员关系测试 ( element in list ) 是通过遍历每个元素来完成的,直到找到所需的元素或到达列表的末尾。因此,此操作的时间复杂度为 O(n)。
  • Python 中的集合是作为哈希表实现的。在检查成员资格 ( element in set ) 时,Python 使用哈希机制,其时间复杂度平均为 O(1)。

这里的技巧重点是在编写程序时仔细考虑底层数据结构。利用正确的数据结构可以显著加快我们的代码速度。

使用推导式而不是 for 循环

Python 中有四种类型的推导式:列表、字典、集合和生成器。它们不仅为创建相对数据结构提供了更简洁的语法,而且比使用 for 循环具有更好的性能。

因为它们在 Python 的 C 实现中进行了优化。

import timeit
​
​
def generate_squares_for_loop():
    squares = []
    for i in range(1000):
        squares.append(i * i)
    return squares
​
​
def generate_squares_comprehension():
    return [i * i for i in range(1000)]
​
​
print(timeit.timeit(generate_squares_for_loop, number=10000))
# 0.2797503340989351
print(timeit.timeit(generate_squares_comprehension, number=10000))
# 0.2364629579242319

上面的代码是列表推导式和 for 循环之间的简单速度比较。如结果所示,列表推导式速度更快。

访问局部变量速度更快

在 Python 中,访问局部变量比访问全局变量或对象的属性更快。

import timeit
​
​
class Example:
    def __init__(self):
        self.value = 0
​
​
obj = Example()
​
​
def test_dot_notation():
    for _ in range(1000):
        obj.value += 1
​
​
def test_local_variable():
    value = obj.value
    for _ in range(1000):
        value += 1
    obj.value = value
​
​
print(timeit.timeit(test_dot_notation, number=1000))
# 0.036605041939765215
print(timeit.timeit(test_local_variable, number=1000))
# 0.024470250005833805

原理也很简单:当编译一个函数时,它内部的局部变量是已知的,但其他外部变量需要时间来检索。

优先考虑内置模块和库

当我们讨论 Python 的时候,通常指的是 CPython,因为 CPython 是 Python 语言的默认和使用最广泛的实现。

考虑到它的大多数内置模块和库都是用C语言编写的,C语言是一种更快、更低级的语言,我们应该利用它的内置库,避免重复造轮子。

import timeit
import random
from collections import Counter
​
​
def count_frequency_custom(lst):
    frequency = {}
    for item in lst:
        if item in frequency:
            frequency[item] += 1
        else:
            frequency[item] = 1
    return frequency
​
​
def count_frequency_builtin(lst):
    return Counter(lst)
​
​
large_list = [random.randint(0, 100) for _ in range(1000)]
​
print(timeit.timeit(lambda: count_frequency_custom(large_list), number=100))
# 0.005160166998393834
print(timeit.timeit(lambda: count_frequency_builtin(large_list), number=100))
# 0.002444291952997446

上面的程序比较了计算列表中元素频率的两种方法。正如我们所看到的,利用 collections 模块的内置计数器比我们自己编写 for 循环更快、更简洁、更好。

使用缓存装饰器

缓存是避免重复计算和提高程序速度的常用技术。

幸运的是,在大多数情况下,我们不需要编写自己的缓存处理代码,因为 Python 提供了一个开箱即用的装饰器 — @functools.cache 。

例如,以下代码将执行两个斐波那契数生成函数,一个具有缓存装饰器,但另一个没有:

import timeit
import functools
​
​
def fibonacci(n):
    if n in (0, 1):
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)
​
​
@functools.cache
def fibonacci_cached(n):
    if n in (0, 1):
        return n
    return fibonacci_cached(n - 1) + fibonacci_cached(n - 2)
​
​
# Test the execution time of each function
print(timeit.timeit(lambda: fibonacci(30), number=1))
# 0.09499712497927248
print(timeit.timeit(lambda: fibonacci_cached(30), number=1))
# 6.458023563027382e-06

可以看到 functools.cache 装饰器如何使我们的代码运行得更快。

缓存版本的速度明显更快,因为它缓存了先前计算的结果。因此,它只计算每个斐波那契数一次,并从缓存中检索具有相同参数的后续调用

while 1 VS while True

如果要创建无限 while 循环,我们可以使用 while True or while 1 .

它们的性能差异通常可以忽略不计。但有趣的是, while 1 稍微快一点。

这是因为是 1 字面量,但 True 是一个全局名称,需要在 Python 的全局作用域中查找。所以 1 的开销很小。

import timeit
​
​
def loop_with_true():
    i = 0
    while True:
        if i >= 1000:
            break
        i += 1
​
​
def loop_with_one():
    i = 0
    while 1:
        if i >= 1000:
            break
        i += 1
​
​
print(timeit.timeit(loop_with_true, number=10000))
# 0.1733035419601947
print(timeit.timeit(loop_with_one, number=10000))
# 0.16412191605195403

正如我们所看到的,确实 while 1 稍微快一些。

然而,现代 Python 解释器(如 CPython )是高度优化的,这种差异通常是微不足道的。所以我们不需要担心这个可以忽略不计的差异。更不用说 while True 比 while 1 可读性更好。

按需导入 Python 模块

在 Python 脚本开头导入所有模块似乎是每个人都会这么做的操作,事实上我们没有必要导入全部的模块。如果模块太大,则根据需要导入它是一个更好的主意。

def my_function():
    import heavy_module
    # rest of the function

如上面的代码所示,heavy_module 在函数中导入。这是一种“延迟加载”的思想:只有 my_function 被调用的时候该模块才会被导入。

这种方法的好处是,如果 my_function 在脚本执行期间从未调用过,则 heavy_module 永远不会加载,从而节省资源并减少脚本的启动时间。

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以扫描下方二维码发送“领取资料”免费领取

​

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码发送“领取资料”免费领取
​

STM32开发 -- LIS3DH三轴加速度计开发详解 这次要讲一下LIS3DH三轴加速度计的开发使用,之前是有讲过 MPU6050开发 的,但当时是在Linux下做的。额,还是个半成品,哈哈。现在手边有STM32的开发板,可以实实在在的来实现以下卡尔曼滤波了。 一、LIS3DH初识 依照惯例,先看一下手册,大致先了解一下,LIS3DH是什么模块。 下载:LIS3DH datasheet 1、描述 LIS3DH是一款超低功耗高性能三轴线性加速度计,属于... 阅读详情

相关推荐

GitLab中国区注册终极解决方案:绕过+86手机验证的实战技巧(2023最新)

本文详细解析了GitLab中国区注册时绕过+86手机验证的三种实战技巧,包括开发者工具调试方案、使用国际号码的变通方案以及本地化部署替代方案。通过技术分析和实践验证,帮助开发者顺利注册GitLab账号,提升团队协作效率。

rl6adventurer的博客 1498

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

Python 是世界上使用最广泛的编程语言之一,但在速度上还有一个非常大的缺点。好在可以通过一些小技巧提升运行速度!Python 是世界上使用最广泛的编程语言之一。它是一种解释型高级通用编程语言,具有广泛的用途,几乎可以将其用于所有事物。其以简单的语法、优雅的代码和丰富的第三方库而闻名。python除了有很多优点外,但在速度上还有一个非常大的缺点。虽然Python代码运行缓慢,但可以通过下面分享的5个小技巧提升Python运行速度!首先,定义一个计时函数timeshow。

Python栈 1494

一文了解向量数据库在RAG中扮演的角色

向量数据库:AI新纪元的基石。探索如何通过这一创新技术优化RAG,提高语言模型的信息处理能力

2401_82452722的博客 2452

怎样提高自己的 Python 编程能力?

简单来说就是多动手、多思考,理论与实践相结合。1. 首先建议 1:理解 Pythonic 概念—详见 Python 中的《Python之禅》建议 2:编写 Pythonic 代码避免不规范代码,比如只用大小写区分变量、使用容易混淆的变量名、害怕过长变量名等。有时候长的变量名会使代码更加具有可读性。深入学习 Python 相关知识,比如语言特性、库特性等,比如 Python 演变过程等。深入学习一两个业内公认的 Pythonic 的代码库,比如 Flask 等。

xx16755498979的博客 1788

vue3的面试题

vue3的面试题

jiang7701037的博客 6265

无需云服务器:飞牛云NAS+Docker搭建本地WordPress站点全球访问

在数字化浪潮中,网站搭建已成为个人和企业在推广自身品牌与业务的首要选择。飞牛云新推出的fnOS,这款集多功能于一身的nas系统,以其卓越的性能和灵活性,成为理想的本地网站部署平台。本文将带你一探如何在飞牛云NAS上通过Docker部署WordPress,并利用cpolar实现全球访问。

LT15171009269的博客 6528

如何提升自己的Python编程能力?

什么是编程能力?——,你的程序写的能让人读懂,这是编程能力;你的,这是编程能力;你的,质量很高,这是编程能力;你能快速理解一个小项目,小模块在做什么,怎么做的,这也是编程能力。

黑马程序员官方博客 843

GIS国土工具实战:从地类分析到坐标转换,一站式解决项目难题

本文详细介绍了GIS国土工具在国土整治项目中的高效应用,涵盖地类分析、坐标转换、影像加载等核心功能。通过实战案例展示如何利用该工具快速处理shp与txt文件转换、智能比对三调二调数据,以及优化影像加载策略,显著提升项目效率。特别适合需要处理复杂国土数据的专业人员使用。

weixin_28732953的博客 334

8个 Python 加速运行优化技巧

本文会介绍不少的 Python 代码加速运行的技巧。在深入代码优化细节之前,需要了解一些代码优化基本原则。

aobulaien001的博客 209

本地部署gradle

在部署CAS构建执行包时,如果按照CAS的官方命令gradlew clean build,如果系统没安装过gradle,这个步骤将会从网上下载gradle,但是进度非常慢,耗时很长。为了更快地完成项目构建,我们可以直接在本地部署好gradle,节省一点时间。

益添的博客 780

华为OD统一考试 - 模拟消息队列(Java & Python& JS & C++ & C )

让我们来模拟一个消息队列的运作,有一个发布者和若干消费者,发布者会在给定的时刻向消息队列发送消息,

算法大师! 3519

让 Python 代码效率更高的 9 个编程技巧

① Python所有方向的学习路线图,清楚各个方向要学什么东西② 600多节Python课程视频,涵盖必备基础、爬虫和数据分析③ 100多个Python实战案例,含50个超大型项目详解,学习不再是只会理论④ 20款主流手游迫解 爬虫手游逆行迫解教程包⑤ 爬虫与反爬虫攻防教程包,含15个大型网站迫解⑥ 爬虫APP逆向实战教程包,含45项绝密技术详解⑦ 超300本Python电子好书,从入门到高阶应有尽有⑧ 华为出品独家Python漫画教程,手机也能学习。

lvaolan的博客 999

【Network Management】DCM模块唤醒网络是主动唤醒还是被动唤醒

DCM模块唤醒网络是主动唤醒还是被动唤醒

qq_36056498的博客 1539

让你的 Python 代码更快的小技巧

我们经常听到 “Python 太慢了”,“Python 性能不行”这样的观点。但是,只要掌握一些编程技巧,就能大幅提升 Python 的运行速度。今天就让我们一起来看下让 Python 性能更高的 9 个小技巧。

2201_76124692的博客 1186

OV9734 DATASHEET,完整规格书

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

让你的 Python 代码更快的 9 个技巧

在最近参加的一些技术会议上,我常常听到参会员在会中讨论技术选型时提到“Python太慢了”。然而,这种观点往往没有考虑到Python的众多优点。实际上,如果能够遵循Pythonic的编程风格,Python的运行速度可以非常快。这其中的关键在于掌握一些技术细节上的巧妙技巧。那些经验丰富的Python开发者通常掌握着许多既微妙又强大的方法来提升代码性能。这些技巧虽然看似简单,但实际上能够显著提高编程效率。接下来,我们将深入讨论九种可以改变你编写和优化Python代码方式的方法。

stone1290的专栏 1092

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

9 个微妙的技巧,让你的 Python 代码更快

Python太慢了。这种观点在关于编程语言的讨论中经常出现,常常掩盖了Python的诸多优点。事实上,如果你能以Pythonic的方式编写代码,Python其实是快速的。关键在于细节。经验丰富的Python开发者掌握着一系列微妙而强大的技巧,以显著提升他们代码的性能。这些技巧乍一看可能看起来微不足道,但它们可以带来效率上的实质性改进。让我们深入探讨这9种方法,转变你编写和优化Python代码的方式。

m0_59236127的博客 1129

用 PyPy 让你的 Python 代码运行得更快!

Python是开发人员中最常用的编程语言之一,但它有一定的局限性。例如,对于某些应用程序而言,它的运行速度可能比其它语言低100倍。这就是为什么当Python的运行速度成为用户瓶颈后,许...

Python中文社区 6228
上一篇: 初学者必会的100个Python编程代码,入门全套资料都给粉丝们整理好了,文末免费领!
下一篇: 想用Python做副业?看这一篇就够了
大模型-小原
博客等级 码龄4年 2689粉丝 212原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值