Python 为什么麻麻没有提高速度?

Python 为什么麻麻没有提高速度?,python,numpy,numba,Python,Numpy,Numba,以下函数是优化问题的一部分。它很简单,但经常被调用。提高速度会很好。我试过Numba,但似乎我必须用FORTRAN编写: import numpy as np from numba import autojit # I am using numbapro: from numbapro import autojit # minimal dataset n_comp_glob = 2 x_glob = np.random.rand(3*n_comp) qs_glob = np.array([10

以下函数是优化问题的一部分。它很简单,但经常被调用。提高速度会很好。我试过Numba,但似乎我必须用FORTRAN编写:

import numpy as np
from numba import autojit
# I am using numbapro: from numbapro import autojit

# minimal dataset
n_comp_glob = 2
x_glob = np.random.rand(3*n_comp) 
qs_glob = np.array([100.])
cp_glob =np.tile(1.,n_comp)
cs_glob = np.array( [100.])

def get_denom(n_comp,qs,x,cp,cs_f):
    k = x[0:n_comp]
    sigma = x[n_comp:2*n_comp]
    z = x[2*n_comp:3*n_comp]
    # calculates the denominator in Equ 14a - 14c (Brooks & Cramer 1992)
    a = 0.0 

    for i in range(n_comp):
         a += (sigma[i] + z[i])*( k[i]*(qs/cs)**(z[i]-1) )*cp[i]

    return denom

get_denom_jit=autojit(get_denom)

import timeit
%timeit get_denom(n_comp_glob,qs_glob,x_glob,cp,cs_glob)
10000 loops, best of 3: 22.9 µs per loop
%timeit get_denom_jit(n_comp_glob,qs_glob,x_glob,cp_glob,cs_glob)
10000 loops, best of 3: 27.9 µs per loop
如果我增加组件的数量,n_comp numba仍然不比python快。为什么?

编辑:

我尝试了一个从下面截取的代码:

调用函数:

%timeit diffuse_array_expressions(100)
100 loops, best of 3: 13.9 ms per loop

%timeit diffuse_array_expressions_jit(100)
100 loops, best of 3: 14.8 ms per loop

%timeit diffuse_loops(100)
1 loops, best of 3: 1.88 s per loop

%timeit diffuse_loops_jit(100)
1000 loops, best of 3: 1.87 ms per loop
因此,当代码在Python中正确实现时,numba似乎失去了它的能力。当然,上述功能可以在没有循环的情况下实现:

def get_denom_vec(n_comp,qs,x,cp,cs_f):
    k = x[0:n_comp]
    sigma = x[n_comp:2*n_comp]
    z = x[2*n_comp:3*n_comp]
    # calculates the denominator in Equ 14a - 14c (Brooks & Cramer 1992)
    a = 0.0 

    a = (sigma + z)*( k*(qs/cs)**(z-1) )*cp
    denom = np.sum(a) + cs
    return denom

get_denom_vec_jit = autojit(get_denom_vec)

%timeit get_denom_vec_jit(n_comp_glob,qs_glob,x_glob,cp_glob,cs_glob)
1000 loops, best of 3: 223 µs per loop

%timeit get_denom_vec_jit(n_comp_glob,qs_glob,x_glob,cp_glob,cs_glob)
1000 loops, best of 3: 245 µs per loop

numba最酷的地方是你可以自己找到它

使用


并迭代修复无法jitted的代码。

使用nopython=True,我得到以下错误:TypingError:在nopython前端失败,未声明+float64,arrayfloat64,1d,C,非标准文件,第行9@Moritz与annotate完全相同。你看,PyObject的所有内容都无法优化,所以你需要开始更改代码,直到所有内容都可以进行JIT。例如,我知道np.random.rand3*n_comp的输出不能在当前的numba版本中进行JIT,因为存在解决方法。但是如果我是你,我会先尝试运行autojit,或者使用jit而不是autojit来指定你提供的类型。附-并查看我对您的代码的建议!好的,明白了。但是np.random.rand的输出是一个numpy数组。我以为jit可以处理数组?jit可以“处理”数组,但它不能加快创建和操作数组的编译代码的速度。您的装饰@autojit可能对解释器没有作用。改为试试@autojit。不,没有提高速度。一些旁白。1不要使用括号作为回报。2不要写函数两次,而是使用get\u denom\u jit=autojitget\u denomWould可以对下一次投票进行评论,这样我下次可以改进这个问题吗?3不要对全局变量和函数参数使用相同的变量名!
def get_denom_vec(n_comp,qs,x,cp,cs_f):
    k = x[0:n_comp]
    sigma = x[n_comp:2*n_comp]
    z = x[2*n_comp:3*n_comp]
    # calculates the denominator in Equ 14a - 14c (Brooks & Cramer 1992)
    a = 0.0 

    a = (sigma + z)*( k*(qs/cs)**(z-1) )*cp
    denom = np.sum(a) + cs
    return denom

get_denom_vec_jit = autojit(get_denom_vec)

%timeit get_denom_vec_jit(n_comp_glob,qs_glob,x_glob,cp_glob,cs_glob)
1000 loops, best of 3: 223 µs per loop

%timeit get_denom_vec_jit(n_comp_glob,qs_glob,x_glob,cp_glob,cs_glob)
1000 loops, best of 3: 245 µs per loop
@autojit(nopython=True)
numba --annotate myfile.py