设为首页收藏本站language→→ 语言切换

鸿鹄论坛

 找回密码
 论坛注册

QQ登录

先注册再绑定QQ

查看: 544|回复: 0
收起左侧

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

[复制链接]
发表于 2020-8-3 18:31:45 | 显示全部楼层 |阅读模式
  在互联网编程语言盛行的今天,Python是比较流行的编程语言之一。但很多程序员对于Python代码性能的方法并不了解。今天这里主要为大家介绍三种提高Python代码性能的简便方法,即是一是基准,基准,基准、二是尽可能避免循环和三使用Cython编译Python模块三点内容。通过这三种方法,如果您想在Jupyter笔记本电脑中利用Cython,可以使用%% Cython魔术,最终以最小的编译函数。
  1.基准,基准,基准
  基准测试听起来像是一个繁琐的过程,但是如果您已经将工作代码分为多个函数,则可以像在要分析的函数中添加装饰器一样简单。
  首先,让我们安装line_profiler,以便我们可以测量函数中每行代码所花费的时间:
  pip3 install line_profiler
  这提供了一个装饰器(@profile),可用于逐行对代码中的任何函数进行基准测试。例如,假设我们有以下代码:
  #filename: test.py@profiledef sum_of_lists(ls):www.zpedu.com/
  '''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倍,但这取决于您要优化的代码类型。

您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2024-4-20 13:56 , Processed in 0.050892 second(s), 8 queries , Redis On.  

  Powered by Discuz!

  © 2001-2024 HH010.COM

快速回复 返回顶部 返回列表