Holy CPU cycles batman!
, de hecho.
Pero por favor considere algo muy fundamental relacionado con numpy
; funcionalidad basada en álgebra lineal sofisticada (como random numbers
o singular value decomposition
). Ahora, tenga en cuenta estos cálculos simples seamingly:
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
y por favor créanme que este tipo de rendimiento no será igual manera significativa por cualquier paquete disponible actualmente.
Por lo tanto, describa su problema real, y trataré de encontrar una solución decente numpy
para él.
Actualización:
Aquí es algunos simplemente código de intersección esfera de rayos:
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)
Al parecer, se ha calculado correctamente:
In []: allclose(mag(X- c), r)
Out[]: True
Y algunos tiempos:
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
Estos tiempos se hacen con una máquina muy modesta. Con la máquina moderna, todavía se puede esperar una aceleración significativa.
De todos modos, esta es solo una breve demostración de cómo codificar con numpy
.
Pensamiento rápido: 'numpy.array' es en realidad una estructura de datos más compleja que una lista. Y en el segundo fragmento, crea una lista ** y ** una matriz numpy (en el primero solo una lista). Si esta es la única razón para una gran diferencia, no puedo decirlo. –
@Felix: bien, pero la creación de la lista es rápida, así que incluso si creo una lista y una matriz numpy en el segundo caso, sigue siendo la creación numpy que es el punto caliente aquí, y sin importar cuán compleja pueda ser la estructura sea, todavía es muy costoso ... –
Pero considere: Crear los datos rara vez es el cuello de botella en una aplicación que tan compleja usa numpy.Tampoco sé lo que sucede debajo del capó, pero obviamente hace que los programas matemáticos pesados sean más rápidos al final del día, así que no hay razón para quejarse;) – delnan