Python的运行效率众所周知普遍比其他编程语言慢。Pycharm和Visual Studio Code本身就运作比较卡,为了提升Python的运行效率,我通常只使用Python的原生程序python.exe运行和调试。我作了几个测试,无意中发现子程序的运行效率比主程序更快。举个简单的例子,从1数到1亿,通过计时对比,子程序运行比主程序快了40%以上。
import time
def test1(n:int):
a:int=1
print('子程序数数')
now=time.time()
while a<n:
a+=1
print(f'耗时:{time.time()-now:.2f}秒。')
if __name__ == '__main__':
print('主程序数数')
a:int=1
n:int=100000000
now=time.time()
while a<n:
a+=1
print(f'耗时:{time.time()-now:.2f}秒。')
# 通过子程序运行
test1(n)
运行结果截图(白色底是IDLE环境,黑色底是Python的命令行模式,如果使用PyCharm、VS Code,运行将会耗更长时间):
这只是简单的数数,在实际项目中,同一段代码放在主程序和放在子程序中,两者运行的时间差可能没有40%那么多,但为了提升Python代码的运行效率,写代码时尽量使用子程序。
Python的运算速度还能不能再提升?
答案是肯定的。 参考知乎上的文章:一行代码让你的python运行速度提高100倍
如果是科学运算,可使用numba库的装饰器@jit加在子程序前面,运算的速度可提升一百倍!
同样一段数数到一亿的代码,对比一下:
import time
from numba import jit
def test1(n:int):
a:int=1
print('子程序数数')
now=time.time()
while a<n:
a+=1
print(f'耗时:{time.time()-now:.2f}秒。')
@jit
def test2(n:int):
a:int=1
while a<n:
a+=1
if __name__ == '__main__':
print('主程序数数')
a:int=1
n:int=100000000
now=time.time()
while a<n:
a+=1
print(f'耗时:{time.time()-now:.2f}秒。')
# 通过子程序运行
test1(n)
print('加上装饰器@jit的子程序数数')
now=time.time()
test2(n)
print(f'耗时:{time.time()-now:.2f}秒。')
@jit的装饰器把CPU运算能力发挥得淋漓尽致,令人刮目相看。
需要注意的是,@jit的装饰器严格统一变量类型,上述代码子程序只有整数型int,如果混有浮点数型的变量,运行起来会报错。如果希望JIT能针对所有类型的参数进行运算,可以使用autojit。