我必须对相对较小的整数进行大量操作(加法),并且我开始考虑哪种数据类型在 64 位机器上能提供最佳性能。
\n我确信uint16将 4 加在一起所需的时间与 1 相同uint64,因为 ALU 可以uint16仅使用 1 个uint64加法器进行 4 次加法。(进位传播意味着这对于单个 64 位加法器来说并不容易,但这就是整数 SIMD 指令的工作原理。)
显然情况并非如此:
\nIn [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) 这是使用 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
哪种方法更快?他们不是一样吗?
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)
一次又一次地运行代码时,它们都会给出不同的最终执行时间。有时前一种方法更快,有时更晚。