小编Ips*_*ium的帖子

多输出和numba签名

也许它是微不足道的,但我想知道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)

表演怎么样?写两个不同的功能更好吗?

python numba

17
推荐指数
2
解决办法
6477
查看次数

优化python中的双循环

我正在尝试优化以下循环:

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)

python performance loops numpy numba

8
推荐指数
3
解决办法
1300
查看次数

Numpy中零的性能

我只是注意到这个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)

python numpy

6
推荐指数
1
解决办法
447
查看次数

Numba表演

我使用了很多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)

python numba

5
推荐指数
0
解决办法
399
查看次数

cython 扩展类型中的函数指针

我正在编写一个 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)

python cython

3
推荐指数
1
解决办法
1307
查看次数

标签 统计

python ×5

numba ×3

numpy ×2

cython ×1

loops ×1

performance ×1