相信用过python的小伙伴都知道python虽然简单易懂,模块丰富,但是python的致命缺点就是真的像蛇一样,运行速度慢,跟C,go,java,c++这几个主流语言没法比。虽然现在也有很多可以加速python代码执行速度的工具,比较有名像Cpython,numba,都能让python的执行速率有很明显的提高。但是这些工具也都是辅助作用,就像电子产品一样,硬件决定了性能上限。所以我们还是要从python程序本身做优化,那么我们就来了解一下哪些编程习惯可以让python运行效率提高
函数
很多大公司的都有自己的编程规范,而其中有一条就是尽量不要让代码裸漏在任何一个地方,其实就是尽量代码都用函数封装起来,这样仅仅是为了可读性强吗?我们来做一个实验吧,我在 pycharm上运行的结果
不调用函数
import time
start = time.time() # 开始计时
sum = 0
for i in range(1, 100000000):
sum = sum + i
print(sum)
end = time.time() # 停止计时
print("执行时间:" + str(end-start) + " s")
'''
output:
4999999950000000
执行时间:15.061724424362183 s
'''
调用函数
我们再看看把这一过程封装起来,通过调用函数的方式的运行时间
import time
start = time.time() # 开始计时
def sum():
sums = 0
for i in range(1, 100000000):
sums = sums + i
print(sums)
sum()
end = time.time() # 停止计时
print("执行时间:" + str(end-start) + " s")
'''
output:
4999999950000000
执行时间:执行时间:7.750258207321167 s
'''
前后的执行时间几乎差了将近一倍,相信很多人都会误认为调用函数会降低执行效率,其实调用函数执行效率高的原因在于变量,在python里面,全局变量和局部变量的操作方式不一样,全局变量只能通过STORE_NAME的方式操作,局部变量采用STORE_FAST的方式操作,至于为什么局部变量会比全局变量读写效率高的深层原因我就不废话了哈,我也不太懂,就先这样记住吧,哈哈!!!
总之我们在写代码时候,尤其是处理数据时候可能需要循环,这时候最好用局部变量,这样可以让程序运行效率提高不少呢
去掉属性访问
我们经常的会把一个模块功能写到一个类里面,然后在其他文件导入这个类,调用类里面的方法,还是上面的例子,这次我们求个平方吧
去掉属性之前
import time
import math
start = time.time() # 开始计时
def test():
for i in range(1, 100000000):
math.pow(i,2)
test()
end = time.time() # 停止计时
print("执行时间:" + str(end-start) + " s")
'''
output:
执行时间:36.00769543647766 s
'''
我们直接把sqrt这个方法导进来看看运行时间
去掉属性之后
import time
from math import pow
start = time.time() # 开始计时
def test():
for i in range(1, 100000000):
pow(i,2)
test()
end = time.time() # 停止计时
print("执行时间:" + str(end-start) + " s")
'''
output:
执行时间:29.405924320220947 s
'''
去掉属性访问后,代码执行效率更高的原因很简单,就是在调用的时候不需要去访问math类里的其他没用到的方法了,所以如果循环里面需要调用其它方法,可以把该方法导进来,提高代码运行效率
列表推导式
最后我们来看看python里的for循环和列表推导式的执行效率差别吧
for循环
import time
from math import pow
start = time.time() # 开始计时
def test():
list1 = []
for i in range(1, 100000000):
list1.append(pow(i,2))
return list1
test()
end = time.time() # 停止计时
print("执行时间:" + str(end-start) + " s")
'''
output:
执行时间:44.09016489982605 s
'''
列表推导式
import time
from math import pow
start = time.time() # 开始计时
def test():
re = [pow(i,2) for i in range(1, 100000000)]
return re
test()
end = time.time() # 停止计时
print("执行时间:" + str(end-start) + " s")
'''
output:
执行时间:37.13862347602844 s
'''
是不是肉眼可见的差别呢,列表推导式内的迭代是C实现的,所以会比python的for循环要快一点。
所以,大家在使用python编程的时候,如果有循环,可以对循环做一下代码的优化,就可以让整个程序运行的效率有明显的提高。
网友评论