0

0

编写高效且可读的 Python 代码的强大技术

聖光之護

聖光之護

发布时间:2024-11-01 11:55:48

|

1017人浏览过

|

来源于dev.to

转载

编写高效且可读的 python 代码的强大技术

python 以其简单性和多功能性而闻名,但即使是经验丰富的开发人员也能从采用最大化性能和可读性的最佳实践中受益。随着数据科学、机器学习和 python 网络开发的兴起,掌握高效的代码技术已成为在当今快速发展的技术环境中保持竞争力的必须条件。在这里,我们将深入探讨 20 种有效的技术来提高 python 代码的性能和可读性,无论您是在处理复杂的项目还是快速的自动化脚本。

1.使用生成器来节省内存

生成器非常适合在不使用过多内存的情况下处理大型数据集。它们一次生成一份数据,而不是将所有数据都保存在内存中。例如,您可以使用生成器逐行读取大型日志文件。

def read_large_file(file_path):
    with open(file_path, 'r') as file:
        for line in file:
            yield line.strip()

这种方法对于数据处理或批量训练等任务特别有用,在这些任务中,使用有限的内存是必不可少的。

2.使用 .setdefault() 设置默认值

如果您需要使用默认值初始化字典中的键,.setdefault() 可以让您免于手动检查。

inventory = {"jeans": 500, "top": 600}
inventory.setdefault("shoes", 0)
print(inventory)

这使得管理默认值更加简洁,并且不需要额外的 if 语句。

3.用字典替换 if-elif 链

使用字典来映射函数而不是长的 if-elif 链使代码更干净且更易于维护。

def start(): print("start")
def stop(): print("stop")
actions = {"start": start, "stop": stop}
action = "start"
actions.get(action, lambda: print("invalid"))()

这种结构提高了可读性和性能,特别是在大型决策树中。

立即学习Python免费学习笔记(深入)”;

4.使用计数器简化计数

集合模块中的 counter 类是简化 python 中计数任务(例如频率分析)的好方法。

from collections import counter
words = ["apple", "banana", "apple", "orange", "banana"]
counts = counter(words)
print(counts)

它无需创建自定义计数函数,并且高效且易于使用。

5.通过记忆化优化递归

记忆化存储昂贵的函数调用的结果,这在斐波那契计算等递归算法中特别有用。

from functools import lru_cache

@lru_cache(maxsize=1000)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

这种方法以最少的额外内存为代价降低了时间复杂度。

6.使用装饰器增加灵活性

python 装饰器对于将可重用功能应用于多个函数非常有用,例如日志记录或计时,而无需修改核心逻辑。

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        print(f"{func.__name__} took {time.time() - start_time:.6f} seconds")
        return result
    return wrapper

@timer
def slow_function():
    time.sleep(1)

slow_function()

7.使用 dataclass 让数据模型变得清晰

python 的数据类通过自动生成 init、repr 和比较方法,使定义简单的数据模型变得更容易且更具可读性。

from dataclasses import dataclass

@dataclass
class employee:
    name: str
    id: int
    salary: float

e = employee("alice", 1, 50000)
print(e)

这有助于减少样板代码并保持数据结构清洁和可维护。

8.结构条件与匹配

使用 python 3.10,结构模式匹配允许您匹配复杂的数据结构,而无需冗长的 if-else 语句。

def describe_point(point):
    match point:
        case (0, 0):
            return "origin"
        case (0, y):
            return f"on y-axis at {y}"
        case (x, 0):
            return f"on x-axis at {x}"
        case (x, y):
            return f"point at ({x}, {y})"

9.将 chained and 替换为 all()

要一次验证多个条件,请使用 all() 来保持代码简洁和可读。

PHPnow template engine1.0
PHPnow template engine1.0

PHPnow是一个基于PHP的高效的PHP模板引擎,主要对于PHP程序的方面快速开发而设计,这意味着PHP代码与HTML是分开的,让程序员有足够的空间发挥编写程序,让网页设计师轻松维护模板代码,而不需要维护PHP与HTML混合的复杂代码,也不需要掌握PHP技术,从而促进程序员和设计师的快速开发/部署,PHPnow快速且易于维护,重点是永久免费开源

下载
fields = ["name", "email", "age"]
data = {"name": "alice", "email": "alice@example.com", "age": 25}
if all(field in data for field in fields):
    print("all fields are present")

10。使用列表推导式

列表推导式使循环简洁且富有表现力,特别是对于简单的转换。

squares = [x ** 2 for x in range(10)]

它们比传统循环更高效、更容易阅读。

11。理解和使用生成器表达式

对于不需要列表的情况,请使用生成器表达式以获得更好的内存效率。

sum_of_squares = sum(x ** 2 for x in range(1000))

生成器表达式通过按需生成值来减少内存使用。

12。尝试使用 zip() 进行并行迭代

zip() 函数可以轻松并行迭代多个列表。

names = ["alice", "bob"]
ages = [25, 30]
for name, age in zip(names, ages):
    print(f"{name} is {age} years old")

13。使用 with 语句安全地处理文件

with 语句确保文件在套件完成后正确关闭,使其成为文件处理的理想选择。

with open("data.txt") as file:
    data = file.read()

这简化了资源管理并最大限度地减少发生错误的可能性。

14。通过类型提示添加安全性

类型提示使您的代码更具可读性,并帮助 ide 在运行前检测潜在错误。

def add(a: int, b: int) -> int:
    return a + b

类型提示提高了可维护性,尤其是在大型代码库中。

15。使用 any() for 或 条件进行简化

要检查列表中的任何条件是否为真,any() 比链式 or 条件更简洁。

permissions = ["read", "write"]
if any(permission == "admin" for permission in permissions):
    print("admin access granted")

16。利用 try- except-else-finally

这种结构允许更清晰的错误处理,并最终增加管理不同场景的灵活性。

try:
    result = risky_function()
except valueerror:
    print("invalid input")
else:
    print("success:", result)
finally:
    print("operation complete")

17。使用命名元组组织数据

命名元组为元组添加结构,使它们更具可读性和自记录性。

from collections import namedtuple

employee = namedtuple("employee", "name id salary")
e = employee(name="alice", id=1, salary=50000)

18。使用 f 字符串改进 str 连接

f 字符串比传统的连接方法更快、更易读,尤其是对于复杂的表达式。

name = "alice"
print(f"hello, {name}!")

19。使用 itertools 进行高效迭代

itertools 模块提供高效的循环选项,例如生成排列、组合或重复元素。

from itertools import permutations

items = [1, 2, 3]
for perm in permutations(items):
    print(perm)

20。使用上下文管理器保持代码整洁

自定义上下文管理器帮助管理资源或清理任务,提高可读性和安全性。

from contextlib import contextmanager

@contextmanager
def open_file(name):
    file = open(name, "w")
    yield file
    file.close()

通过集成这些技术,您可以编写出不仅更高效而且更易读和可维护的 python 代码。尝试这些技巧,并逐渐将它们融入到您的日常编码实践中。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1208

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1184

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

192

2025.07.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号