当前位置: 首页 > 科技观察

时间管理很重要:优化Python代码之道

时间:2023-03-16 19:21:38 科技观察

时间管理是一门大学问,如何在有限的时间内让代码跑得更快,性能更好,是我们应该思考的问题。毕竟,成为伟大程序员的道路就是不断超越自己,寻找最优解。本文将为您提供一些时间管理技巧。1.优化代码和算法首先,仔细阅读你的代码和算法。许多速度问题可以通过实施更好的算法或添加缓存来解决。具体的指导方针可能会写满整本书,但要遵循的一些一般指导方针是:测试,不要猜测。测试代码的哪些部分运行时间最长,并首先关注这些部分。减少内存使用。一般来说,尽量减少内存使用。例如:逐行分析一个大文件,而不先将其存储在内存中。执行缓存。如果您要从磁盘、网络和数据库中进行多次重复搜索,那么进行缓存可能是一个很好的优化。尽量减少代码中的迭代次数,尤其是内部操作。避免(深度)递归。对于Python解释器,这需要大量内存和内务处理,请改用生成器和迭代等。重用对象而不是在每次迭代中创建新对象。Python必须清理它创建的每个对象以释放内存。这称为垃圾收集。许多未使用对象的垃圾收集过程会显着降低软件速度。不要这样做。你真的需要做手术吗?以后可以做吗?或者可以只做一次运算并存储结果而不是一遍又一遍地计算吗?2.使用PyPy你可能正在使用PythonCPython的参考实现——CPython,因为它是用C语言编写的,所以被称为CPython。很多人都在使用它。但是如果你确定你的代码是计算密集型的,PyPy会是更好的选择。这可能是一个快速修复,无需更改一行代码。PyPy声称:它平均比CPython快4.4倍。它通过使用称为即时编译(JIT)的技术来加速代码执行。其他JIT包括Java和.NET框架。另一方面,CPython使用解释器来执行代码,虽然这提供了很大程度的灵活性,但速度非常慢。使用JIT,代码在程序运行时编译。它结合了提前编译(由C和C++等语言使用)的速度优势和解释器的灵活性。此外,JIT编译器可以在代码运行时不断对其进行优化。代码运行的时间越长,它就越优化。PyPy近年来发展迅速,经常可以用作Python2和3的直接替代品。它还可以与Pipenv等工具完美配合。3.使用AsyncioAsyncio是Python中一个相对较新的核心库。它解决了与线程相同的问题:即加速I/O密集型软件系统,但Asyncio的处理方式不同。我实际上不喜欢在Python中使用asyncio。Asyncio相当复杂,尤其是对于初学者。由于asyncio库在过去几年中发生了很大变化,因此网络上的教程和示例代码通常已经过时。但这并不意味着它没有用。这是一个强大的范例,可用于许多高性能应用程序。4.使用多线程大多数软件系统是I/O密集型而非计算密集型:I/O密集型——软件系统通常等待输入/输出操作完成。从网络或慢速内存中获取数据时通常会出现这种情况。计算密集型——软件系统将CPU(中央处理器)推向极限。它使用CPU的所有功能来生成所需的结果。在等待网络或磁盘的响应时,可以使用多个线程来保持其他部分运行。线程是独立的执行序列。默认情况下,Python程序有一个主线程。但是你可以创建更多的线程,让Python在不同的线程之间切换。这种转变发生得如此之快,以至于它似乎同时并排运行。线程是共享相同存储的独立执行序列。与其他语言不同,Python多线程不能同时运行,而是轮流运行,主要是因为它的全局解释器锁(GIL)机制。可见,多线程对I/O密集型软件系统影响巨大,但在计算密集型软件系统中用处不大。为什么会这样?简单的。当一个线程等待来自网络的应答时,其他线程可以继续运行。如果您正在执行大量网络请求,使用多线程会产生很大的不同。但是,如果多个线程正在进行大量计算,它们只会等待轮到它们再继续。线程只会引入更多开销。图片来源:fadeevab5。同时使用更多处理器如果软件系统是计算密集型的,通常可以重写代码以同时使用更多处理器。这样,执行速度可以线性缩放。这称为并行性。并非所有算法都可以并行运行。例如,简单地并行化递归算法是不可能的。但是几乎总有一种替代算法可以很好地并行运行。有两种使用更多处理器的方法:在同一台计算机上使用多个处理器和/或内核。在Python中,这可以通过使用多处理库来完成。使用计算机网络来使用分布在多台机器上的处理器。我们称之为分布式计算。与线程库不同,多处理库绕过了Python全局解释器锁。它实际上是通过生成多个Python实例来实现的。因此,使用多线程在单个Python进程内轮流执行,您将有多个Python处理器同时运行您的代码。VisualMultiprocessing多处理库与线程库非常相似。那么为什么还要考虑线程呢?是的,线程“更轻”。它只需要一个正在运行的Python解释器,需要更少的内存,并且生成新进程有其开销。因此,如果代码是I/O密集型的,使用线程可能就足够了。在使软件系统并行工作之后,使用像Hadoop这样的分布式计算只是一小步。通过利用云计算平台,目前可以相对轻松地加快速度。例如,可以在云端处理庞大的数据集,并在本地使用结果。通过使用混合方法,您可以节省一些现金,因为云中的计算能力可能非常昂贵。希望这些小技巧能帮助你拥有更快更强的代码。