相关疑难解决方法(0)

使用 NumPy 对 uint16 与 uint64 数组求和时没有加速吗?

我必须对相对较小的整数进行大量操作(加法),并且我开始考虑哪种数据类型在 64 位机器上能提供最佳性能。

\n

我确信uint16将 4 加在一起所需的时间与 1 相同uint64,因为 ALU 可以uint16仅使用 1 个uint64加法器进行 4 次加法。(进位传播意味着这对于单个 64 位加法器来说并不容易,但这就是整数 SIMD 指令的工作原理。)

\n

显然情况并非如此:

\n
In [3]: data = np.random.rand(10000)\n\nIn [4]: int16 = data.astype(np.uint16)\n\nIn [5]: int64 = data.astype(np.uint64)\n\nIn [6]: int32 = data.astype(np.uint32)\n\nIn [7]: float32 = data.astype(np.float32)\n\nIn [8]: float64 = data.astype(np.float64)\n\nIn [9]: %timeit int16.sum()\n13.4 \xc2\xb5s \xc2\xb1 43.3 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000 loops each)\n\nIn [10]: %timeit int32.sum()\n13.9 \xc2\xb5s \xc2\xb1 347 …
Run Code Online (Sandbox Code Playgroud)

python performance numpy simd compiler-optimization

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

为什么 np.dot 比使用 for 循环求点积快得多

这是使用 np.dot 的时间:

import numpy as np
import timeit

x = np.random.random(size=10**7)
a = np.ones(x.size)

%time np.dot(x, a)
Run Code Online (Sandbox Code Playgroud)

挂壁时间:11 毫秒

5001679.267011214

这是使用 for 循环的时间:

import numpy as np
import timeit

x = np.random.random(size=10**7)
a = np.ones(x.size)

def innfeldi(vigur1, vigur2):
    return sum([vigu1[i]*vigur2[i] for i in range(len(vigur1))])

%timeit innfeldi(x, a)
Run Code Online (Sandbox Code Playgroud)

挂壁时间:4.78 秒

4998161.0032265792

python numpy

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

哪种方法更快?为什么 np.sum(arr) vs arr.sum()?

哪种方法更快?他们不是一样吗?

start = time.time()
arr = np.array([1,2,3,4,5,6,7,8,9,0,12])
total_price =  np.sum(arr[arr < 7])* 2.14

print(total_price)
print('Duration: {} seconds'.format(time.time() - start))
Run Code Online (Sandbox Code Playgroud)
start = time.time()
arr = np.array([1,2,3,4,5,6,7,8,9,0,12])
total_price =  (arr[arr<7]).sum()* 2.14

print(total_price)
print('Duration: {} seconds'.format(time.time() - start))
Run Code Online (Sandbox Code Playgroud)

一次又一次地运行代码时,它们都会给出不同的最终执行时间。有时前一种方法更快,有时更晚。

python numpy sum time-complexity space-complexity

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