”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Python编程优化技术。

Python编程优化技术。

发布于2024-08-25
浏览:796

Python programming optimisation techniques.

优化代码至关重要,因为它直接影响软件的效率、性能和可扩展性。编写良好的代码运行速度更快,消耗的资源更少,并且更易于维护,使其更适合处理更大的工作负载并改善用户体验。它还降低了运营成本,因为高效的代码需要更少的处理能力和内存,这在资源有限的环境中尤其重要,例如嵌入式系统或大规模云应用程序。

另一方面,编写得不好的代码可能会导致执行时间变慢、能源消耗增加以及基础设施成本更高。例如,在 Web 应用程序中,低效的代码可能会减慢页面加载速度,导致用户体验不佳,并可能导致用户流失。在数据处理任务中,低效的算法会显着增加处理大型数据集所需的时间,从而延迟关键的见解和决策。

此外,优化的代码通常更容易维护和扩展。通过遵循优化最佳实践,开发人员可以确保其代码库保持干净和模块化,从而更轻松地根据需要更新或扩展应用程序。随着软件项目复杂性的增加以及对系统的需求的增加,这一点变得越来越重要。

让我们探索 10 种 Python 编程优化技术,它们可以帮助您编写更高效、性能更佳的代码。这些技术对于开发满足性能要求同时保持可扩展性和可维护性的强大应用程序至关重要。通过遵循最佳实践,这些技术也可以应用于其他编程语言。

1. 变量打包

变量打包通过将多个数据项分组到单个结构中来最大限度地减少内存使用。在内存访问时间显着影响性能的场景(例如大规模数据处理)中,此技术至关重要。当相关数据打包在一起时,可以更有效地使用 CPU 缓存,从而加快数据检索速度。

例子:

import struct

# Packing two integers into a binary format
packed_data = struct.pack('ii', 10, 20)

# Unpacking the packed binary data
a, b = struct.unpack('ii', packed_data)

在这个例子中,使用struct模块将整数打包成紧凑的二进制格式,使数据处理更加高效。

2. 存储与内存

理解存储(磁盘)和内存(RAM)之间的区别至关重要。内存操作速度更快,但易失性,而存储是持久的,但速度较慢。在性能关键型应用程序中,将频繁访问的数据保留在内存中并最大限度地减少存储 I/O 对于速度至关重要。

例子:

import mmap

# Memory-mapping a file
with open("data.txt", "r b") as f:
    mmapped_file = mmap.mmap(f.fileno(), 0)
    print(mmapped_file.readline())
    mmapped_file.close()

内存映射文件允许您将磁盘存储视为内存,从而加快大文件的访问时间。

3. 固定长度变量与可变长度变量

固定长度变量存储在连续的内存块中,使访问和操作更快。另一方面,可变长度变量需要额外的开销来管理动态内存分配,这可能会减慢操作速度,特别是在实时系统中。

例子:

import array

# Using fixed-length array for performance
fixed_array = array.array('i', [1, 2, 3, 4, 5])

# Dynamic list (variable-length)
dynamic_list = [1, 2, 3, 4, 5]

这里,array.array提供了一个固定长度的数组,提供比动态列表更可预测的性能。

4. 内部职能与公共职能

内部函数是那些仅在定义它们的模块内使用的函数,通常针对速度和效率进行优化。公共函数公开供外部使用,并且可能包括额外的错误处理或日志记录,这使得它们的效率稍低。

例子:

def _private_function(data):
    # Optimized for internal use, with minimal error handling
    return data ** 2

def public_function(data):
    # Includes additional checks for external use
    if isinstance(data, int):
        return _private_function(data)
    raise ValueError("Input must be an integer")

通过将大量计算保留在私有函数中,您可以优化代码的效率,保留公共函数以实现外部安全性和可用性。

5. 函数修饰符

在Python中,装饰器充当函数修饰符,允许您在函数主执行之前或之后添加功能。这对于缓存、访问控制或日志记录等任务很有用,可以优化多个函数调用的资源使用。

例子:

from functools import lru_cache

@lru_cache(maxsize=100)
def compute_heavy_function(x):
    # A computationally expensive operation
    return x ** x

使用 lru_cache 作为装饰器缓存昂贵的函数调用的结果,通过避免冗余计算来提高性能。

6. 使用库

利用库可以让您避免重新发明轮子。像 NumPy 这样的库是用 C 语言编写的,并且是为了性能而构建的,与纯 Python 实现相比,它们对于繁重的数值计算来说更加高效。

例子:

import numpy as np

# Efficient matrix multiplication using NumPy
matrix_a = np.random.rand(1000, 1000)
matrix_b = np.random.rand(1000, 1000)
result = np.dot(matrix_a, matrix_b)

这里,NumPy 的点函数针对矩阵运算进行了增强,远远优于纯 Python 中的嵌套循环。

7. 短路条件

短路减少了不必要的评估,这在复杂的条件检查或涉及资源密集型操作时特别有价值。它可以防止执行不需要检查的条件,从而节省时间和计算能力。
由于条件检查将在找到满足条件的第一个值时停止,因此您应该首先放置最有可能验证/无效条件的变量。在 OR 条件(or)中,尝试将最可能为 true 的变量放在前面,而在 AND 条件(and)中,尝试将最可能为 false 的变量放在前面。一旦检查了该变量,条件就可以退出,而无需检查其他值。

例子:

def complex_condition(x, y):
    return x != 0 and y / x > 2  # Stops evaluation if x is 0

在此示例中,Python 的逻辑运算符确保仅当 x 非零时才执行除法,从而防止潜在的运行时错误和不必要的计算。

8. 释放内存

在长时间运行的应用程序中,尤其是那些处理大型数据集的应用程序中,一旦不再需要内存就必须释放内存。这可以使用 del、gc.collect() 或允许对象超出范围来完成。

例子:

import gc

# Manual garbage collection to free up memory
large_data = [i for i in range(1000000)]
del large_data
gc.collect()  # Forces garbage collection

使用 gc.collect() 可确保及时回收内存,这在内存受限的环境中至关重要。

9. 简短的错误消息

在内存或带宽有限的系统中,例如嵌入式系统或分布式应用程序中的日志记录,短错误消息可以减少开销。这种做法也适用于需要大规模错误日志记录的场景。

例子:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Err: Div/0")  # Short, concise error message

短错误消息在资源效率至关重要的环境中非常有用,例如物联网设备或高频交易系统。

10. 优化循环

循环是效率低下的常见原因,尤其是在处理大型数据集时。通过减少迭代、简化逻辑或使用矢量化运算来优化循环可以显着提高性能。

例子:

import numpy as np

# Vectorised operation with NumPy
array = np.array([1, 2, 3, 4, 5])

# Instead of looping through elements
result = array * 2  # Efficient, vectorised operation

矢量化消除了对显式循环的需要,利用低级优化来加快执行速度。


通过应用这些技术,您可以确保您的 Python 或其他编程语言程序运行得更快、使用更少的内存并且更具可扩展性,这对于数据科学、Web 和系统编程中的应用程序尤其重要。

PS:可以使用https://perfpy.com/#/检查python代码效率。

版本声明 本文转载于:https://dev.to/jamesbright/10-python-programming-optimisation-techniques-5ckf?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在Python中高效比较字典中相等的键值对?
    如何在Python中高效比较字典中相等的键值对?
    比较字典是否相等的键值对在Python中,比较字典以检查键值对是否相等是一项常见任务。一种方法是迭代字典并使用 zip 和 iteritems 方法比较每一对字典。然而,还有一些替代方法可以提供更好的代码优雅性。其中一种方法是使用字典理解来创建仅包含共享键值对的新字典。代码如下:shared_ite...
    编程 发布于2024-11-06
  • 如何在 PHP 中使用数组函数向左旋转数组元素?
    如何在 PHP 中使用数组函数向左旋转数组元素?
    在 PHP 中向左旋转数组元素在 PHP 中旋转数组,将第一个元素移动到最后一个元素并重新索引数组,可以使用 PHP 的 array_push() 和 array_shift() 函数组合来实现。PHP 函数:PHP 没有专门用于旋转的内置函数数组。但是,以下代码片段演示了如何模拟所需的旋转行为:$...
    编程 发布于2024-11-06
  • 如何解决Java访问文件时出现“系统找不到指定的路径”错误?
    如何解决Java访问文件时出现“系统找不到指定的路径”错误?
    解决 Java 中遇到“系统找不到指定的路径”时的文件路径问题在 Java 项目中,尝试访问文本时遇到错误来自指定相对路径的文件。此错误是由于 java.io.File 类无法定位指定路径而产生的。要解决此问题,建议从类路径中检索文件,而不是依赖文件系统。通过这样做,您可以消除相对路径的需要,并确保...
    编程 发布于2024-11-06
  • Laravel 中的 defer() 函数如何工作?
    Laravel 中的 defer() 函数如何工作?
    Taylor Otwell 最近宣布了 Laravel 中的新函数 defer()。这只是对 defer() 函数如何工作以及使用它可能遇到的问题进行非常基本的概述。 找出问题 还记得您曾经需要从 API 获取某些内容,然后在幕后执行一些用户不关心但仍在等待的操作的路由吗?是的,我们都至少经历过一次...
    编程 发布于2024-11-06
  • 在 Python Notebook 中探索使用 PySpark、Pandas、DuckDB、Polars 和 DataFusion 的数据操作
    在 Python Notebook 中探索使用 PySpark、Pandas、DuckDB、Polars 和 DataFusion 的数据操作
    Apache Iceberg Crash Course: What is a Data Lakehouse and a Table Format? Free Copy of Apache Iceberg the Definitive Guide Free Apache Iceberg Crash ...
    编程 发布于2024-11-06
  • Vue + Tailwind 和动态类
    Vue + Tailwind 和动态类
    我最近在做的一个项目使用了Vite、Vue和Tailwind。 使用自定义颜色一段时间后,我遇到了一些困惑。 在模板中添加和使用自定义颜色不是问题 - 使用 Tailwind 文档使该过程非常清晰 // tailwind.config.js module.exports = { them...
    编程 发布于2024-11-06
  • 端到端(E 测试:综合指南
    端到端(E 测试:综合指南
    端到端测试简介 端到端(E2E)测试是软件开发生命周期的重要组成部分,确保整个应用程序流程从开始到结束都按预期运行。与专注于单个组件或几个模块之间交互的单元或集成测试不同,端到端测试从用户的角度验证整个系统。这种方法有助于识别应用程序不同部分交互时可能出现的任何问题,确保无缝且无错误的用户体验。 ...
    编程 发布于2024-11-06
  • 可以在 Go 结构标签中使用变量吗?
    可以在 Go 结构标签中使用变量吗?
    在 Go 结构体标签中嵌入变量Go 的结构体标签通常用于注释和元数据,通常涉及简单的字符串文字。但是,用户可能会遇到在这些标签中需要动态或计算值的情况。考虑以下结构,其中带有为 JSON 封送注释的“类型”字段:type Shape struct { Type string `json:&q...
    编程 发布于2024-11-06
  • 如何增强 Visual Studio 的构建详细程度以实现深入洞察?
    如何增强 Visual Studio 的构建详细程度以实现深入洞察?
    熟悉 Visual Studio 的构建详细程度需要全面了解 Visual Studio 构建过程背后的复杂细节?别再犹豫了!虽然使用 vcbuild 不会产生所需的详细输出,但 Visual Studio 的设置中隐藏着一个解决方案。采取以下简单步骤即可解锁大量信息:导航至 Visual Stud...
    编程 发布于2024-11-06
  • 开发者日记# 谁写的?
    开发者日记# 谁写的?
    有一个想法困扰着我。也许,我们无法识别它,但日复一日,我们周围越来越多的人工智能生成的内容。 LinkedIn 或其他平台上的有趣图片、视频或帖子。我对帖子的媒体内容没有疑问(很容易识别它何时生成、从库存中获取或创建),但我对帖子的内容表示怀疑。几乎每次我读一篇文章时,我都会想这是谁写的?是作者分享...
    编程 发布于2024-11-06
  • 哪种方法计算数据库行数更快:PDO::rowCount 或 COUNT(*)?为什么?
    哪种方法计算数据库行数更快:PDO::rowCount 或 COUNT(*)?为什么?
    PDO::rowCount 与 COUNT(*) 性能在数据库查询中计算行数时,选择使用 PDO:: rowCount 和 COUNT(*) 会显着影响性能。PDO::rowCountPDO::rowCount 返回受最后一个 SQL 语句影响的行数。但是,对于 SELECT 语句,某些数据库可能会...
    编程 发布于2024-11-06
  • PART# 使用 HTTP 进行大型数据集的高效文件传输系统
    PART# 使用 HTTP 进行大型数据集的高效文件传输系统
    让我们分解提供的HTML、PHP、JavaScript和CSS代码对于分块文件上传仪表板部分。 HTML 代码: 结构概述: Bootstrap for Layout:代码使用 Bootstrap 4.5.2 创建一个包含两个主要部分的响应式布局: 分块上传部分:用于...
    编程 发布于2024-11-06
  • 比较:Lithe 与其他 PHP 框架
    比较:Lithe 与其他 PHP 框架
    如果您正在为下一个项目探索 PHP 框架,很自然会遇到 Laravel、Symfony 和 Slim 等选项。但是,是什么让 Lithe 与这些更强大、更知名的框架区分开来呢?以下是一些突出 Lithe 如何脱颖而出的注意事项。 1. 轻量级和性能 Lithe 的设计重点关注轻量级架...
    编程 发布于2024-11-06
  • 编码风格指南:编写简洁代码的实用指南
    编码风格指南:编写简洁代码的实用指南
    在过去的五年里,我一直在不断尝试提高我的编码技能,其中之一就是学习和遵循最推荐的编码风格。 本指南旨在帮助您编写一致且优雅的代码,并包含一些提高代码可读性和可维护性的建议。它的灵感来自于社区中最受接受的流行指南,但进行了一些修改以更适合我的喜好。 值得一提的是,我是一名全栈 JavaScript 开...
    编程 发布于2024-11-06
  • 检查类型是否满足 Go 中的接口
    检查类型是否满足 Go 中的接口
    在Go中,开发人员经常使用接口来定义预期的行为,使代码灵活且健壮。但是如何确保类型真正实现接口,尤其是在大型代码库中? Go 提供了一种简单有效的方法来在编译时验证这一点,防止运行时错误的风险并使您的代码更加可靠和可读。 您可能见过类似的语法 var _ InterfaceName = TypeN...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3