当前位置:首页 > 滚动 >  > 正文
不要再写低效的Python代码,一些小Tips
来源:哔哩哔哩  时间:2023-06-09 19:53:31
字号:

hello,本期将和大家一起继续拓展一些优化 Python 代码性能的有用技巧,一起看看吧


(资料图)

1. 使用 Python 调试器 (pdb)

Python 调试器允许单步执行代码,可以使用它来查找瓶颈并优化代码

该例展示了如何使用 Python 调试器 (pdb) 来优化函数。pdb.set_trace() 语句放置在循环内以在每次迭代时进入调试器。这使得能够在每次迭代时检查变量和代码流,真得很常用~

2. 使用内置函数与库

Python 提供了各种可以高效执行复杂任务的内置函数和库。例如,使用 map()将函数应用于列表中的每个元素,或使用 pandas 库来操作 DataFrame 中的数据

3. 使用生成器

生成器是一种在 Python 中创建迭代器的高效节省内存方式。通常用于迭代大型数据集而无需将它们存储在内存中

该例定义了一个函数 read_file,它逐行读取文件并使用生成器在读取时生成每一行。该函数使用 with 语句打开文件,以确保文件在完成后正确关闭。当以文件名作为参数调用该函数时,它返回一个生成器对象。然后 for 循环遍历生成器返回的每一行并将其打印到控制台。

4. 使用元组与字典推导

与列表推导类似

5. 使用最有效的数据结构

高效的数据结构可以通过为各种操作提供不同的时间复杂度来极大地提高 Python 代码的性能。选择最佳数据结构会对代码速度产生重大影响

例如,对于较大的列表,使用列表实现队列数据结构可能会很慢,因为从列表的开头追加和弹出很慢。相反,使用专为实现队列而设计的 collections.deque 对象可以显著提高性能

下例说明正确的数据结构如何在搜索数字列表的最大值和最小值时提高代码性能:

6. 使用装饰器简化代码

关于装饰器之前有专门发过一篇

Python内置装饰器太强了

装饰器是 Python 中的一个强大工具,可以修改函数或类的行为。可用于简化代码并提高其性能

例如,假设有一个可能引发异常的函数:

可以将此函数包装在 try/except 块中以处理异常:

如上,当调用 potentially_error_prone_function() 时,如果引发异常,它将被捕获并打印一条消息,而不是程序崩溃,当然,项目要落地还是要深挖为何引发异常,这个亏我算是吃太多了

7. 尽可能避免使用 try-except

和上面不冲突,try-except 块会降低代码速度,可以改用条件语句来处理错误

该例使用 try-except 块来处理分母为零的情况。此方法可能很慢且效率低下,尤其是当 try-except 块位于经常调用的函数中时。另一方面,好的代码应该在执行除法前检查分母是否为零,这是处理零分母情况的一种更快、更有效的方法。

8. 使用Cython加速代码

Cython 是 Python 的超集,允许为 Python 编写 C 扩展,可以显著加快我们的代码速度,特别是对于计算密集型任务

下例是使用 Cython 加速计算平方和的 Python 函数的示例:

首先创建一个包含该函数的 Cython 版本的 .pyx 文件

我们为变量添加了类型声明 (cdef int),这允许 Cython 生成更快的 C 代码

要将 Cython 代码编译成 Python 扩展模块,需要创建一个 setup.py 文件:

现在可以通过运行 python setup.py build_ext --inplace 来编译扩展模块

这将创建一个名为 sum_squares_cython.so(或 Windows 上的 sum_squares_cython.pyd)的文件

最后,可以在 Python 中导入并使用 sum_squares_cython 函数:

以上就是本期全部内容,下次再见~

标签: