python速度代码_⼀⾏代码让你的python运⾏速度提⾼100倍Python⽤的好,猪也能飞起来。
今天,带⼤家学习如何让Python飞起来的⽅法,⼲货满满哦!
python⼀直被病垢运⾏速度太慢,但是实际上python的执⾏效率并不慢,慢的是python⽤的解释器Cpython运⾏效率太差。
“⼀⾏代码让python的运⾏速度提⾼100倍”这绝不是的论调。
我们来看⼀下这个最简单的例⼦,从1⼀直累加到1亿。
最原始的代码:
import timedef foo(x,y):        tt = time.time()        s = 0        for i in range(x,y):                s += i        print('Time used: {} sec'.form tt))        return sprint(foo(1,100000000))
结果:
Time used: 6.779874801635742 sec4999999950000000
我们来加⼀⾏代码,再看看结果:
from numba import jitimport time@jitdef foo(x,y):        tt = time.time()        s = 0        for i in range(x,y):                s += i        prin tt))        return sprint(foo(1,100000000))
结果:二次函数的解析式怎么求
Time used: 0.04680037498474121 sec4999999950000000
是不是快了100多倍呢?
那么下⾯就分享⼀下“为啥numba库的jit模块那么⽜掰?”
NumPy的创始⼈Travis Oliphant在离开Enthought之后,创建了CONTINUUM,致⼒于将Python⼤数据处理⽅⾯的应⽤。最近推出的Numba项⽬能够将处理NumPy数组的Python函数JIT编译为机器码执⾏,从⽽上百倍的提⾼程序的运算速度。
Numba项⽬的主页上有Linux下的详细安装步骤。编译LLVM需要花⼀些时间。Windows⽤户可以从Un
official Windows Binaries for Python Extension Packages下载安装LLVMPy、meta和numba等⼏个扩展库。
下⾯我们看⼀个例⼦:
import numba as nbfrom numba import jit@jit('f8(f8[:])')def sum1d(array):    s = 0.0    n = array.shape[0]    for i in range(n):
numba中提供了⼀些修饰器,它们可以将其修饰的函数JIT编译成机器码函数,并返回⼀个可在Python中调⽤机器码的包装对象。为了能将Python函数编译成能⾼速执⾏的机器码,我们需要告诉JIT编译器函数的各个参数和返回值的类型。我们可以通过多种⽅式指定类型信息,
在上⾯的例⼦中,类型信息由⼀个字符串’f8(f8[:])’指定。其中’f8’表⽰8个字节双精度浮点数,括号前⾯的’f8’表⽰返回值类型,
括号⾥的表⽰参数类型,’[:]’表⽰⼀维数组。因此整个类型字符串表⽰sum1d()是⼀个参数为双精度浮点数的⼀维数组,返回值是⼀个双
精度浮点数。需要注意的是,JIT所产⽣的函数只能对指定的类型的参数进⾏运算:
print s(10, dtype=np.int32))print s(10, dtype=np.float32))print s(10, dtype=np.floa 3121.46201599944e+18510.0
python基础代码100例
如果希望JIT能针对所有类型的参数进⾏运算,可以使⽤autojit:
from numba import autojit@autojitdef sum1d2(array):    s = 0.0    n = array.shape[0]    for i in range(n):        s += array[i]    ret
autoit虽然可以根据参数类型动态地产⽣机器码函数,但是由于它需要每次检查参数类型,因此计算速度也有所降低。numba的⽤法很简
单,基本上就是⽤jit和autojit这两个修饰器,和⼀些类型对象。下⾯的程序列出numba所⽀持的所有类型:
print [obj for obj in nb.__dict__.values() if isinstance(obj, nb.minivect.minitypes.Type)]
tp5最新漏洞[size_t, Py_uintptr_t, uint16, complex128, float, complex256, void, int , long double,unsigned PY_LONG_LONG, uint32, complex256
⼯作原理numba的通过meta模块解析Python函数的ast语法树,对各个变量添加相应的类型信息。然后调⽤llvmpy⽣成机器码,最后再⽣
成机器码的Python调⽤接⼝。
meta模块
通过研究numba的⼯作原理,我们可以到许多有⽤的⼯具。例如meta模块可在程序源码、ast语法树以及Python⼆进制码之间进⾏相互
转换。下⾯看⼀个例⼦:
def add2(a, b):    return a + b
decompile_func能将函数的代码对象反编译成ast语法树,⽽str_ast能直观地显⽰ast语法树,使⽤这两个⼯具学习Python的ast语法树是
很有帮助的。
from meta.decompiler import decompile_funcfrom meta.asttools import str_astprint str_ast(decompile_func(add2))FunctionDe [Name(ctx=Param(),                                      id='a'),                                Name(ctx=Param(),                                      id='b')],              [],                          kwarg=None,                          vararg=None),            body=
[Return(value=BinOp(left=Name(ctx=Load(),                                              id='a'),                                    op=Add(),                          [],            name='add2')
⽽python_source可以将ast语法树转换为Python源代码:
from meta.asttools import python_sourcepython_source(decompile_func(add2))def add2(a, b):    return (a + b)
decompile_pyc将上述⼆者结合起来,它能将Python编译之后的pyc或者pyo⽂件反编译成源代码。下⾯我们先写⼀个tmp.py⽂件,然后
通过py_compile将其编译成tmp.pyc。
with open("tmp.py", "w") as f:    f.write("""def square_sum(n):    s = 0    for i in range(n):        s += i**2    return s""")import py_co
随机数字表法的定义
下⾯调⽤decompile_pyc将tmp.pyc显⽰为源代码:
with open("tmp.pyc", "rb") as f:    decompile_pyc(f)def square_sum(n):    s = 0    for i in range(n):        s += (i ** 2)    return s
llvmpy模块
LLVM是⼀个动态编译器,llvmpy则可以通过Python调⽤LLVM动态地创建机器码。直接通过llvmpy创建机器码是⽐较繁琐的,例如下⾯
的程序创建⼀个计算两个整数之和的函数,并调⽤它计算结果。
import Module, Type, import ExecutionEngine, GenericValue# Create a new module with a fu
grep命令多条件查
addr = ee.get_pointer_to_function(f_add)addr2975997968L
然后通过ctypes.PYFUNCTYPE创建⼀个函数类型:
import ctypesf_type = ctypes.PYFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_int)
f = f_type(addr)f(100, 42)142riview
numba所完成的⼯作就是:解析Python函数的ast语法树并加以改造,添加类型信息;将带类型信息的ast语法树通过llvmpy动态地转换为
机器码函数,然后再通过和ctypes类似的技术为机器码函数创建包装函数供Python调⽤。
END
进学习交流
扫码加X先⽣进学习交流
温馨提⽰
欢迎⼤家转载、转发、留⾔、点赞⽀持X先⽣。⽂末⼴告点⼀下也是对X先⽣莫⼤的⽀持。
更多精彩推荐,请关注我们

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。