也许它是微不足道的,但我想知道jit
如果有几个输出,如何在装饰器中写签名.
例如 :
import numba as nb
@nb.jit(['???(int32, int32, float(:,:), float(:,:))'], nopython=True)
def foo(nx, ny, a, b):
for i in range(nx):
for i in range(ny):
do stuff with a & b
return a, b
Run Code Online (Sandbox Code Playgroud)
表演怎么样?写两个不同的功能更好吗?
我正在尝试优化以下循环:
def numpy(nx, nz, c, rho):
for ix in range(2, nx-3):
for iz in range(2, nz-3):
a[ix, iz] = sum(c*rho[ix-1:ix+3, iz])
b[ix, iz] = sum(c*rho[ix-2:ix+2, iz])
return a, b
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的解决方案,并发现使用numba计算产品总和可以获得更好的性能:
import numpy as np
import numba as nb
import time
@nb.autojit
def sum_opt(arr1, arr2):
s = arr1[0]*arr2[0]
for i in range(1, len(arr1)):
s+=arr1[i]*arr2[i]
return s
def numba1(nx, nz, c, rho):
for ix in range(2, nx-3):
for iz in range(2, nz-3):
a[ix, iz] = sum_opt(c, rho[ix-1:ix+3, iz])
b[ix, iz] = sum_opt(c, …
Run Code Online (Sandbox Code Playgroud) 我只是注意到这个zeros
函数numpy
有一个奇怪的行为:
%timeit np.zeros((1000, 1000))
1.06 ms ± 29.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.zeros((5000, 5000))
4 µs ± 66 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Run Code Online (Sandbox Code Playgroud)
另一方面,ones
似乎有一个正常的行为.有人知道为什么用这个zeros
函数初始化一个小的numpy数组需要比一个大数组更多的时间?
(Python 3.5,numpy 1.11)
我使用了很多numba的jit
装饰器,我最近意识到numba中添加了新功能,特别是parallel
选项和stencil
装饰器.
模板非常适合制作更干净的代码,但经过几次测试后,它似乎只是美观,效率不高.这是一个示例代码:
@numba.njit
def nb_jit(A, out):
for i in range(1, A.shape[0]-1):
out[i] = 0.5*(A[i+1] - A[i-1])
return out
@numba.njit(numba.float64[:](numba.float64[:], numba.float64[:]))
def nb_jit_typed(A, out):
for i in range(1, A.shape[0]-1):
out[i] = 0.5*(A[i+1] - A[i-1])
return out
@numba.njit(parallel=True)
def nb_jit_paral(A, out):
for i in numba.prange(1, A.shape[0]-1):
out[i] = 0.5*(A[i+1] - A[i-1])
return out
@numba.stencil
def s2(A):
return 0.5*(A[1] - A[-1])
@numba.njit
def nb_stencil(A):
return s2(A)
@numba.njit(parallel=True)
def nb_stencil_paral(A):
return s2(A)
Run Code Online (Sandbox Code Playgroud)
我用以下数组测试了这些函数:
import numpy as np
arr …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个 cython 模块,它提供了几种使用优化cdef
函数的扩展类型。其中一些扩展类型(大约 10 个,每个包含大约 200 行代码)具有完全相同的结构,但不调用相同的cdef
函数。我想分解我的模块,以便只有一种扩展类型可以处理我需要的所有不同配置。
为了使这一点更清楚,这是我正在编写的模块结构的一个(非常愚蠢的)示例:
cdef class A1:
cdef double x
def __init__(self, double x):
self.x = x
def apply(self):
self.x = f1(self.x)
cdef class A2:
cdef double x
def __init__(self, double x):
self.x = x
def apply(self):
self.x = f2(self.x)
cdef double f1(double x):
return x**1
cdef double f2(double x):
return x**2
...
Run Code Online (Sandbox Code Playgroud)
以及我想获得的分解代码类型:
cdef class A:
cdef int n
cdef double x
def __init__(self, double x, int n):
self.x = x …
Run Code Online (Sandbox Code Playgroud)