这个答案 @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*2和A+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 …
我使用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) 我试图找到使用 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)