如何有效提高Python代码的执行效率?
- 内容介绍
- 文章标签
- 相关推荐
本文共计717个文字,预计阅读时间需要3分钟。
Python运行速度慢,但实际执行效率并不慢,慢的是Python使用的解释器Cpython的运行效率差异。一行代码让Python运行速度提升100倍,这绝不仅是群众取巧的理论调调。
python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差。
“一行代码让python的运行速度提高100倍”这绝不是哗众取宠的论调。
我们来看一下这个最简单的例子,从1一直累加到1亿。
最原始的代码:
importtime deffoo(x,y): tt=time.time() s=0 foriinrange(x,y): s+=i print('Timeused:{}sec'.format(time.time()-tt)) returns print(foo(1,100000000))
结果
Timeused:6.779874801635742sec 4999999950000000
是不是快了100多倍呢?
那么下面就分享一下“为啥numba库的jit模块那么牛掰?”
NumPy的创始人Travis Oliphant在离开Enthought之后,创建了CONTINUUM,致力于将Python大数据处理方面的应用。最近推出的Numba项目能够将处理NumPy数组的Python函数JIT编译为机器码执行,从而上百倍的提高程序的运算速度。
Numba项目的主页上有Linux下的详细安装步骤。编译LLVM需要花一些时间。
Windows用户可以从Unofficial Windows Binaries for Python Extension Packages下载安装LLVMPy、meta和numba等几个扩展库。
下面我们看一个例子:
importnumbaasnb fromnumbaimportjit @jit('f8(f8[:])') defsum1d(array): s=0.0 n=array.shape[0] foriinrange(n): s+=array[i] returns importnumpyasnp array=np.random.random(10000) %timeitsum1d(array) %timeitnp.sum(array) %timeitsum(array) 10000loops,bestof3:38.9usperloop 10000loops,bestof3:32.3usperloop 100loops,bestof3:12.4msperloop
numba中提供了一些修饰器,它们可以将其修饰的函数JIT编译成机器码函数,并返回一个可在Python中调用机器码的包装对象。为了能将Python函数编译成能高速执行的机器码,我们需要告诉JIT编译器函数的各个参数和返回值的类型。我们可以通过多种方式指定类型信息,在上面的例子中,类型信息由一个字符串'f8(f8[:])'指定。其中'f8'表示8个字节双精度浮点数,括号前面的'f8'表示返回值类型,括号里的表示参数类型,'[:]'表示一维数组。因此整个类型字符串表示sum1d()是一个参数为双精度浮点数的一维数组,返回值是一个双精度浮点数。
内容扩展:
Python运行速度提升
相比较C,C++,python一直被抱怨运行速度很慢,实际上python的执行效率并不慢,而是解释器Cpython运行效率很差。
通过使用numba库的jit可以让python的运行速度提高百倍以上。
同诺简单累加,相乘的例子,可以看出。
#!/usr/bin/env python # encoding: utf-8 ''' @author: Victor @Company:华中科技大学电气学院聚变与等离子研究所 @version: V1.0 @contact: 1650996069@qq.com 2018--2020 @software: PyCharm2018 @file: quickPython3.py @time: 2018/9/21 20:54 @desc:使用numba的jit是python代码运行速度提高100倍左右 ''' '''平常运行''' import time def add(x,y): tt = time.time() s = 0 for i in range(x,y): s += i print('The time used: {} seconds'.format(time.time()-tt)) return s add(1,100000000) ##########结果############### # D:\Python3\python.exe D:/Pycharm2018Works/InsteringPython3/SomeBasics/quickPython3.py # The time used: 6.712835788726807 seconds # Process finished with exit code 0
'''调用numba运行''' import time from numba import jit @jit def add(x,y): tt = time.time() s = 0 for i in range(x,y): s += i print('The time used: {} seconds'.format(time.time()-tt)) return s add(1,100000000) ##########结果############### # D:\Python3\python.exe D:/Pycharm2018Works/InsteringPython3/SomeBasics/quickPython3.py # The time used: 0.06396007537841797 seconds # # Process finished with exit code 0
Numba模块能够将处理NumPy数组的Python函数JIT编译为机器码执行,从而上百倍的提高程序的运算速度。
本文共计717个文字,预计阅读时间需要3分钟。
Python运行速度慢,但实际执行效率并不慢,慢的是Python使用的解释器Cpython的运行效率差异。一行代码让Python运行速度提升100倍,这绝不仅是群众取巧的理论调调。
python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差。
“一行代码让python的运行速度提高100倍”这绝不是哗众取宠的论调。
我们来看一下这个最简单的例子,从1一直累加到1亿。
最原始的代码:
importtime deffoo(x,y): tt=time.time() s=0 foriinrange(x,y): s+=i print('Timeused:{}sec'.format(time.time()-tt)) returns print(foo(1,100000000))
结果
Timeused:6.779874801635742sec 4999999950000000
是不是快了100多倍呢?
那么下面就分享一下“为啥numba库的jit模块那么牛掰?”
NumPy的创始人Travis Oliphant在离开Enthought之后,创建了CONTINUUM,致力于将Python大数据处理方面的应用。最近推出的Numba项目能够将处理NumPy数组的Python函数JIT编译为机器码执行,从而上百倍的提高程序的运算速度。
Numba项目的主页上有Linux下的详细安装步骤。编译LLVM需要花一些时间。
Windows用户可以从Unofficial Windows Binaries for Python Extension Packages下载安装LLVMPy、meta和numba等几个扩展库。
下面我们看一个例子:
importnumbaasnb fromnumbaimportjit @jit('f8(f8[:])') defsum1d(array): s=0.0 n=array.shape[0] foriinrange(n): s+=array[i] returns importnumpyasnp array=np.random.random(10000) %timeitsum1d(array) %timeitnp.sum(array) %timeitsum(array) 10000loops,bestof3:38.9usperloop 10000loops,bestof3:32.3usperloop 100loops,bestof3:12.4msperloop
numba中提供了一些修饰器,它们可以将其修饰的函数JIT编译成机器码函数,并返回一个可在Python中调用机器码的包装对象。为了能将Python函数编译成能高速执行的机器码,我们需要告诉JIT编译器函数的各个参数和返回值的类型。我们可以通过多种方式指定类型信息,在上面的例子中,类型信息由一个字符串'f8(f8[:])'指定。其中'f8'表示8个字节双精度浮点数,括号前面的'f8'表示返回值类型,括号里的表示参数类型,'[:]'表示一维数组。因此整个类型字符串表示sum1d()是一个参数为双精度浮点数的一维数组,返回值是一个双精度浮点数。
内容扩展:
Python运行速度提升
相比较C,C++,python一直被抱怨运行速度很慢,实际上python的执行效率并不慢,而是解释器Cpython运行效率很差。
通过使用numba库的jit可以让python的运行速度提高百倍以上。
同诺简单累加,相乘的例子,可以看出。
#!/usr/bin/env python # encoding: utf-8 ''' @author: Victor @Company:华中科技大学电气学院聚变与等离子研究所 @version: V1.0 @contact: 1650996069@qq.com 2018--2020 @software: PyCharm2018 @file: quickPython3.py @time: 2018/9/21 20:54 @desc:使用numba的jit是python代码运行速度提高100倍左右 ''' '''平常运行''' import time def add(x,y): tt = time.time() s = 0 for i in range(x,y): s += i print('The time used: {} seconds'.format(time.time()-tt)) return s add(1,100000000) ##########结果############### # D:\Python3\python.exe D:/Pycharm2018Works/InsteringPython3/SomeBasics/quickPython3.py # The time used: 6.712835788726807 seconds # Process finished with exit code 0
'''调用numba运行''' import time from numba import jit @jit def add(x,y): tt = time.time() s = 0 for i in range(x,y): s += i print('The time used: {} seconds'.format(time.time()-tt)) return s add(1,100000000) ##########结果############### # D:\Python3\python.exe D:/Pycharm2018Works/InsteringPython3/SomeBasics/quickPython3.py # The time used: 0.06396007537841797 seconds # # Process finished with exit code 0
Numba模块能够将处理NumPy数组的Python函数JIT编译为机器码执行,从而上百倍的提高程序的运算速度。

