相关疑难解决方法(0)

Numpy:划分0.5的特别之处是什么?

这个答案 @Dunes的状态,即由于管道-ING有(几乎)没有浮点乘法和除法之间的差别.但是,从我对其他语言的看法来看,我认为这种划分会更慢.

我的小测试看起来如下:

A=np.random.rand(size)
command(A)
Run Code Online (Sandbox Code Playgroud)

对于不同的命令,size=1e8我在我的机器上得到以下时间:

Command:    Time[in sec]:
A/=0.5      2.88435101509
A/=0.51     5.22591209412
A*=2.0      1.1831600666
A*2.0       3.44263911247  //not in-place, more cache misses?
A+=A        1.2827270031
Run Code Online (Sandbox Code Playgroud)

最有趣的部分:除以0.5几乎是除以的两倍0.51.可以假设,这是由于一些智能优化,例如替换除法A+A.不过的时机A*2A+A太过离谱支持这一要求.

一般来说,使用浮点数除以值(1/2)^n的速度更快:

Size: 1e8
    Command:    Time[in sec]:
    A/=0.5      2.85750007629
    A/=0.25     2.91607499123
    A/=0.125    2.89376401901
    A/=2.0      2.84901714325
    A/=4.0      2.84493684769
    A/=3.0      5.00480890274
    A/=0.75     5.0354950428
    A/=0.51     5.05687212944
Run Code Online (Sandbox Code Playgroud)

如果我们看一下,它会变得更有趣size=1e4:

Command:    1e4*Time[in sec]:
A/=0.5      3.37723994255
A/=0.51     3.42854404449
A*=2.0      1.1587908268
A*2.0       1.19793796539
A+=A        1.11329007149
Run Code Online (Sandbox Code Playgroud)

现在,有一个由部门之间没有区别.5 …

python performance numpy

35
推荐指数
2
解决办法
813
查看次数

在Cython与NumPy中总和int和浮点数时的性能差异很大

我使用Cython或NumPy对一维数组中的每个元素求和.当求和整数时, Cython的速度提高了约20%.总结浮点数时,Cython 约2.5倍.以下是使用的两个简单函数.

#cython: boundscheck=False
#cython: wraparound=False

def sum_int(ndarray[np.int64_t] a):
    cdef:
        Py_ssize_t i, n = len(a)
        np.int64_t total = 0

    for i in range(n):
        total += a[i]
    return total 

def sum_float(ndarray[np.float64_t] a):
    cdef:
        Py_ssize_t i, n = len(a)
        np.float64_t total = 0

    for i in range(n):
        total += a[i]
    return total
Run Code Online (Sandbox Code Playgroud)

计时

创建两个每个包含100万个元素的数组:

a_int = np.random.randint(0, 100, 10**6)
a_float = np.random.rand(10**6)

%timeit sum_int(a_int)
394 µs ± 30 µs per loop (mean ± std. dev. of 7 …
Run Code Online (Sandbox Code Playgroud)

python numpy cython

12
推荐指数
1
解决办法
464
查看次数

Cython 中的数组求和数组

我试图找到使用 Cython 对 numpy 数组进行水平求和的最快方法。首先,假设我有一个 10 x 100,000 随机浮点数的 2D 数组。我可以创建一个object数组,每列作为数组中的一个值,如下所示:

n = 10 ** 5
a = np.random.rand(10, n)
a_obj = np.empty(n, dtype='O')
for i in range(n):
    a_obj[i] = a[:, i]
Run Code Online (Sandbox Code Playgroud)

我想做的就是找到每一行的总和。它们都可以这样简单地计算:

%timeit a.sum(1)
414 µs ± 24.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit a_obj.sum()
113 ms ± 7.01 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Run Code Online (Sandbox Code Playgroud)

对象数组慢 250 倍。

在尝试总结之前,我想对每个元素的访问时间进行计时。Cython 在直接遍历每个项目时无法加速访问对象数组的每个成员:

def access_obj(ndarray[object] …
Run Code Online (Sandbox Code Playgroud)

numpy cython

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

标签 统计

numpy ×3

cython ×2

python ×2

performance ×1