像@ shx2說的,這一切都取決於什麼是foo
。如果你能在numpy的ufuncs方面表達出來,然後用outer
方法:
In [11]: N = 400
In [12]: B = np.empty((N, N))
In [13]: x = np.random.random(N)
In [14]: y = np.random.random(N)
In [15]: %%timeit
for i in range(N):
for j in range(N):
B[i, j] = x[i] - y[j]
....:
10 loops, best of 3: 87.2 ms per loop
In [16]: %timeit A = np.subtract.outer(x, y) # <--- np.subtract is a ufunc
1000 loops, best of 3: 294 µs per loop
否則,您可以推動循環下來用Cython水平。繼續以上一個簡單的例子:
In [45]: %%cython
cimport cython
@cython.boundscheck(False)
@cython.wraparound(False)
def foo(double[::1] x, double[::1] y, double[:, ::1] out):
cdef int i, j
for i in xrange(x.shape[0]):
for j in xrange(y.shape[0]):
out[i, j] = x[i] - y[j]
....:
In [46]: foo(x, y, B)
In [47]: np.allclose(B, np.subtract.outer(x, y))
Out[47]: True
In [48]: %timeit foo(x, y, B)
10000 loops, best of 3: 149 µs per loop
的用Cython例如故意製造過於簡單化:在現實中,你可能要添加一些形狀/步幅檢查,你的函數等
使用矢量化函數,它將使用Numpy的「外部」函數同時處理va和vb的所有元素...或傳遞va和vb的網格... – 2014-10-31 11:03:21
問題是此函數是自定義的,並且正在變爲矢量化是不平凡的。我嘗試使用'np.meshgrid',然後使用'np.vectorize',但性能改進很小。 – 2014-10-31 11:17:15
'vectorize'對你的'foo'的內部沒有任何作用。這只是一個包裝,而不是最終每個標量調用'foo(a,b)'。這是一種方便,而不是加速工具。 – hpaulj 2014-10-31 20:36:49