Holy CPU cycles batman!
, действительно.
Но, пожалуйста, рассмотрите что-то очень фундаментальное, связанное с numpy
;сложные функции, основанные на линейной алгебре (например, random numbers
или singular value decomposition
).Теперь рассмотрим эти на первый взгляд простые вычисления:
In []: A= rand(2560000, 3)
In []: %timeit rand(2560000, 3)
1 loops, best of 3: 296 ms per loop
In []: %timeit u, s, v= svd(A, full_matrices= False)
1 loops, best of 3: 571 ms per loop
и, поверьте мне, этот вид производительности не будет значительно уступать ни одному из доступных на данный момент пакетов.
Итак, опишите вашу реальную проблемуи я постараюсь найти для него достойное решение на основе numpy
.
Обновление:
Вот просто код для пересечения лучевой сферы:
import numpy as np
def mag(X):
# magnitude
return (X** 2).sum(0)** .5
def closest(R, c):
# closest point on ray to center and its distance
P= np.dot(c.T, R)* R
return P, mag(P- c)
def intersect(R, P, h, r):
# intersection of rays and sphere
return P- (h* (2* r- h))** .5* R
# set up
c, r= np.array([10, 10, 10])[:, None], 2. # center, radius
n= 5e5
R= np.random.rand(3, n) # some random rays in first octant
R= R/ mag(R) # normalized to unit length
# find rays which will intersect sphere
P, b= closest(R, c)
wi= b<= r
# and for those which will, find the intersection
X= intersect(R[:, wi], P[:, wi], r- b[wi], r)
Видимо, мы правильно рассчитали:
In []: allclose(mag(X- c), r)
Out[]: True
И некоторые тайминги:
In []: % timeit P, b= closest(R, c)
10 loops, best of 3: 93.4 ms per loop
In []: n/ 0.0934
Out[]: 5353319 #=> more than 5 million detection's of possible intersections/ s
In []: %timeit X= intersect(R[:, wi], P[:, wi], r- b[wi])
10 loops, best of 3: 32.7 ms per loop
In []: X.shape[1]/ 0.0327
Out[]: 874037 #=> almost 1 million actual intersections/ s
Эти тайминги сделаны на очень скромной машине.С современной машиной все еще можно ожидать значительного ускорения.
В любом случае, это всего лишь короткая демонстрация того, как кодировать с помощью numpy
.