大家好!今天,让我们来谈谈如何加速你的python代码。Python语言具有语法简单易懂、模块丰富、应用广泛等优点。但是世界上没有完美的东西。python一个明显的缺点就是运行速度慢,至少比不上C语言。因此,不满足于现状的Pythoner开发了很多工具。其中最著名的是Cython和Numba。其中Cython可以将Python代码转换成C代码执行,Numba是Python中的JIT编译器(即时编译器),提高运行效率。不过今天我们先不说这些复杂的工具,让我们看看你能不能改进你的Python代码来提高速度。Function函数可以提高代码的可读性,那么使用函数会影响程序的执行效率吗?我们来做一个对比实验。我们先看一个没有函数的版本:importmathimporttimestart=time.time()#开始计时lst=[]#defineanemptylistforiinrange(1,10000000):lst.append(math.sqrt(i))#疯狂添加计算结果到列表end=time.time()#停止计时print(end-start)这段代码在我的电脑上输出2.124(不同配置的电脑结果不同,可以多次运行求平均值价值)。让我们尝试添加一个函数:importmathimporttimedeffunc():lst=[]#defineanemptylistforiinrange(1,10000000):lst.append(math.sqrt(i))#疯狂地向列表添加计算resultreturnlst#返回结果start=time.time()#开始计时lst=func()end=time.time()#停止计时print(end-start)在我的电脑上,使用该函数的程序大概用了1.743秒。经过多次尝试,基本上会比之前的版本节省15-20%左右的时间,这个差距依然存在。可能有人会觉得,加上了函数调用,效率可能就低了。但实际上我们这里只加了一个调用,作用不大。但是由于Python中局部变量和全局变量的实现方式不同,使用局部变量效率更高。所以使用函数不仅提高了可读性,而且用得好还能让代码运行得更快。删除属性访问并查看另一个示例。还是刚才的功能版。我们稍微修改一下,将函数从math.sqrt导入到sqrt的方式:frommathimportsqrt#直接引用特定的函数或属性importtimedeffunc():lst=[]foriinrange(1,10000000):lst.append(sqrt(i))#直接调用sqrtreturnlststart=time.time()lst=func()end=time.time()print(end-start)其他代码没有改动,该程序的输出时间变为...1.413秒!快点。这就是为什么?因为在访问属性的时候,会调用这个对象的getattribute或者getattr方法,造成额外的开销,拖慢速度。列表推导最后我们来看一下列表推导(ListComprehension)。它的效率会不会和普通的for循环不同?在上一个版本上继续修改:frommathimportsqrtimporttimedeffunc():#将for循环改为列表理解lst=[sqrt(i)foriinrange(1,10000000)]returnlststart=time.time()lst=func()end=time.time()print(end-start)结果是0.968秒!这就是为什么?因为listcomprehension里面的迭代是用C实现的,效率更高。与原来的版本相比,要达到同样的效果,我们只需要调整代码的写法,速度提高了一倍以上。如果本文对您有帮助,请您在离开前点个赞,感谢您的阅读~
