我对python numpy很新。
如果我有一个numpy向量列表。什么是确保计算速度快的最佳方法。
我目前正在做这件事,我发现它太慢了。
vec = sum(list of numpy vectors) # 4 vectors of 500 dimensions each
使用sum确实占用了相当多的时间。
答案 0 :(得分:2)
这是你想要做的(但有更大的数组)?
git revert 5816058f
In [193]: sum([np.ones((2,3)),np.arange(6).reshape(2,3)])
Out[193]:
array([[ 1., 2., 3.],
[ 4., 5., 6.]])
描述不清楚。你的意思是形状为500 dimensions each
或(500,)
的数组?如果是后者,那么总共有多少元素。
事实上,它是这些数组中的4个的列表不应该是一个大问题。 ndim==500
的时间是什么?
如果数组每个只有500个元素,那么总和时间是微不足道的:
array1 + array2
另一方面,具有许多小尺寸的数组的总和较慢,因为这样的数组要大得多
In [195]: timeit sum([np.arange(500),np.arange(500),np.arange(500),np.arange(500)])
10000 loops, best of 3: 20.9 µs per loop
答案 1 :(得分:1)
在我看来,这已经是最快的变种了。它是纯numpy
,因此在C
- 代码中计算。
替代方案可以是单独计算每个向量的总和,然后对列表的值求和或者叠加所有向量,然后求和。但两者都比较慢:
import numpy as np
import time
n = 10000
start = time.time()
for i in range(n):
lst = np.hstack([np.random.random(500) for i in range(4)])
x = np.sum(lst)
print("stack then np.sum: ", time.time()- start)
start = time.time()
for i in range(n):
lst = [np.sum(np.random.random(500)) for i in range(4)]
x = np.sum(lst)
print("sum up individually: ", time.time()- start)
start = time.time()
for i in range(n):
lst = [np.random.random(500) for i in range(4)]
x = np.sum(lst)
print("np.sum on list of vectors:", time.time()- start)
输出:
堆栈然后np.sum:0.35804247856140137
单独总结:0.400468111038208
载体列表上的np.sum:0.3427283763885498