在互联网编程语言盛行的今天,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的信息,请继续关注中培信息。