软件研发

三种提高Python代码性能的简便方法

2020-08-03 17:03:13 | 来源:中培企业IT培训网

在互联网编程语言盛行的今天,Python是比较流行的编程语言之一。但很多程序员对于Python代码性能的方法并不了解。今天这里主要为大家介绍三种提高Python代码性能的简便方法,即是一是基准,基准,基准、二是尽可能避免循环和三使用Cython编译Python模块三点内容。通过这三种方法,如果您想在Jupyter笔记本电脑中利用Cython,可以使用%% Cython魔术,最终以最小的编译函数。

  1.基准,基准,基准

基准测试听起来像是一个繁琐的过程,但是如果您已经将工作代码分为多个函数,则可以像在要分析的函数中添加装饰器一样简单。

首先,让我们安装line_profiler,以便我们可以测量函数中每行代码所花费的时间:

pip3 install line_profiler

这提供了一个装饰器(@profile),可用于逐行对代码中的任何函数进行基准测试。例如,假设我们有以下代码:

#filename: test.py@profiledef sum_of_lists(ls):

'''Calculates the sum of an input list of lists'''

s = 0

for l in ls:

for val in l:

s += val

return s

#create a list of lists

smallrange = list(range(10000))

inlist = [smallrange, smallrange, smallrange, smallrange]#now sum them

list_sum = sum_of_lists(inlist)

print(list_sum)

这将在调用sum_of_lists函数时对其进行概要分析 -请注意函数定义上方的@profile装饰器。

现在,我们可以通过执行以下操作来分析代码:

python3 -m line_profiler test.py

这给了我们:

第5列显示了在每一行上花费的运行时的百分比-这将使您指向最需要优化的代码部分,因为这是花费大部分运行时的地方。

请记住,此基准测试库具有大量开销,但是它非常适合在代码中查找弱点并将其替换为更有效率的东西。

要在Jupyter笔记本中运行line_profiler,请查看%% lprun magic命令。

  2.尽可能避免循环

在许多情况下,在python中使用map,list comprehensions或numpy.vectorize(通常是最快的)之类的操作而不是循环,可以在不进行大量工作的情况下显着提高性能,因为这些操作在内部进行了优化。让我们通过将嵌套循环替换为map和sum来稍微修改前面的示例:

#filename: test_map.pydef sum_of_lists_map(ls):

'''Calculates the sum of an input list of lists'''

return(sum(list(map(sum,ls))))#create a list of lists

smallrange = list(range(10000))

inlist = [smallrange,smallrange,smallrange,smallrange]#now sum them

list_sum = sum_of_lists_map(inlist)

print(list_sum)

让我们将新地图版本定时1000次,以了解它们与原始地图相比的效果:

地图版本比原始版本快6倍以上!

  3.使用Cython编译Python模块

如果您根本不想修改项目,但仍然希望免费获得一些性能提升,则Cython是您的朋友。

尽管Cython不是通用的python C编译器,但是Cython允许您将python模块编译为共享对象文件(.so),可以由您的主要python脚本加载。

为此,您将需要在计算机上安装Cython以及C编译器:

pip3 install cython

如果您使用的是Debian,则可以执行以下操作下载GCC:

sudo apt install gcc

让我们将示例代码分成2个文件,分别名为test_cython.py和test_module.pyx:

#filename: test_module.pyxdef sum_of_lists(ls):

'''Calculates the sum of an input list of lists'''

s = 0

for l in ls:

for val in l:

s += val

return s

我们的主文件必须从test_module.pyx文件导入此功能:

#filename: test_cython.pyfrom test_module import *#create a list of lists

smallrange = list(range(10000))

inlist = [smallrange,smallrange,smallrange,smallrange]#now sum them

list_sum = sum_of_lists(inlist)

print(list_sum)

现在让我们定义一个setup.py文件来使用Cython编译我们的模块:

#filename: setup.pyfrom setuptools import setupfrom Cython.Build import cythonize

setup(

ext_modules = cythonize("test_module.pyx")

)

最后,是时候编译我们的模块了:

python3 setup.py build_ext --inplace

现在,通过对它们进行1000次计时,可以看到该版本与原始版本相比有何改进:

在这种情况下,Cython的速度比原始速度提高了近2倍,但这取决于您要优化的代码类型。

以上即是关于三种提高Python代码性能的简便方法的全部内容,想了解更多关于Python的信息,请继续关注中培信息。