什么叫python代码的优化_优化Python代码

本文探讨了优化Python代码的几种方法,包括使用cProfile进行剖析,利用PyCallGraph生成执行图,以及通过改进算法和数据结构提高效率。提到了Python的特性如使用map函数加速循环,以及通过JIT编译器如PyPy提升性能。文章强调在优化前应确保使用正确的算法,并提供了更多资源链接以获取更多信息。
摘要由CSDN通过智能技术生成

如果你的问题是关于优化python代码(我认为应该是这样),那么你可以做各种各样的intesting的事情,但是首先:

你可能不应该痴迷于优化python代码!如果您正在使用最快的算法来解决问题,并且python不能做得足够快,您应该使用其他语言.

也就是说,有几种方法可以采取(因为有时候,你真的希望使python代码更快):

个人资料(先做这个!)

CPROFILE

这是你应该实际使用的,虽然解释结果可能有点令人生畏.

每个功能输入或退出时都可以录制,调用函数是什么(跟踪异常).

你可以像这样在cProfile里运行一个函数:

import cProfile

cProfile.run('myFunction()', 'myFunction.profile')

然后查看结果:

import pstats

stats = pstats.Stats('myFunction.profile')

stats.strip_dirs().sort_stats('time').print_stats()

这将显示大部分时间用于哪些功能.

PyCallGraph

PyCallGraph提供了一个漂亮的,也许是最简单的剖析python程序的方法 – 这是一个很好的介绍,以了解程序花费的时间在哪里,但是它增加了重要的执行开销

运行pycallgraph:

pycallgraph graphviz ./myprogram.py

简单!你会得到一个png图形图像作为输出(可能是一段时间…)

使用库

如果你想在python中做一些模块已经存在(甚至在标准库中),那么可以使用该模块!

大多数标准库模块都是使用C编写的,它们将比例如bisection search的等效python实现快几百倍.

让口译员尽可能多地做你的工作

解释器会为你做一些事情,比如循环.真?是!您可以使用地图,缩小和过滤关键字,以显着加快紧缩循环:

考虑:

for x in xrange(0, 100):

doSomethingWithX(x)

VS:

map(doSomethingWithX, xrange(0,100))

很明显,这可能更快,因为口译员只需要处理一个单一的陈述,而不是两个,但这有点模糊.事实上,这更快,有两个原因:

>所有的流程控制(我们完成了循环…)在解释器中完成

> doSomethingWithX函数名只能解析一次

在for循环中,每次循环python都要检查doSomethingWithX函数的确切位置!即使使用缓存,这是一个开销.

请记住,Python是一种口译语言

(请注意,这一节真的是关于微小的优化,你不应该让它影响你正常的,可读的编码风格!)

如果您从编译语言(如c或Fortran)编程的背景出发,那么关于不同python语句的性能的一些事情可能会令人惊讶:

尝试:便宜,如果是昂贵的

如果你有这样的代码:

if somethingcrazy_happened:

uhOhBetterDoSomething()

else:

doWhatWeNormallyDo()

如果发生了一些疯狂的事情,doWhatWeNormallyDo()会抛出异常,那么安排你的代码就会更快:

try:

doWhatWeNormallyDo()

except SomethingCrazy:

uhOhBetterDoSomething()

为什么?解释员可以直接潜水,开始做你通常做的事情;在第一种情况下,解释器必须在每次执行if语句时执行一个符号查找,因为该名称可能会在上一次执行语句后引用不同的内容! (和名称查找,特别是如果somethingcrazy_happened是全球性的可以是不平凡的).

你的意思是谁?

由于名称查找的成本,也可以更好地在函数中缓存全局值,并将简单的布尔测试放入像这样的函数中:

未优化功能:

def foo():

if condition_that_rarely_changes:

doSomething()

else:

doSomethingElse()

优化的方法,而不是使用变量,利用解释器正在对函数进行名称查找的事实!

条件成立时:

foo = doSomething # now foo() calls doSomething()

当条件变为假时:

foo = doSomethingElse # now foo() calls doSomethingElse()

PyPy

PyPy是用python编写的python实现.当然这意味着它会运行代码无限慢?好吧,不行PyPy实际上使用即时编译器(JIT)运行python程序.

如果您不使用任何外部库(或者您使用的是compatible with PyPy),那么这是非常简单的(几乎可以肯定的)加快程序中重复任务的方法.

基本上,JIT可以生成代码,它将执行python解释器的操作,但要快得多,因为它是针对单个情况生成的,而不是处理每个可能的合法python表达式.

下一步去哪里

当然,您应该看到的第一个地方是改进算法和数据结构,并考虑像缓存这样的事情,甚至是否需要首先做这么多事情,但无论如何:

python.org wiki This page提供了许多有关如何加快Python代码的信息,尽管有些已经过时了.

>这是关于优化循环的BDFL himself.

有很多事情,即使我自己有限的经验,我错过了,但这个答案已经够久了!

这一切都是基于我自己最近的一些python代码的经验,只是不够快,我想再次强调,我真的不认为任何我建议的是一个好主意,有时候虽然,你必须….

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值