Holy CPU cycles batman!
, thực sự.
Nhưng vui lòng xem xét điều gì đó rất cơ bản liên quan đến numpy
; chức năng dựa trên đại số tuyến tính tinh vi (như random numbers
hoặc singular value decomposition
). Bây giờ, hãy xem xét các tính toán đơn giản này:
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
và hãy tin tưởng rằng loại hiệu suất này sẽ không bị đánh bại đáng kể bởi bất kỳ gói nào hiện có sẵn.
Vì vậy, hãy mô tả vấn đề thực sự của bạn và tôi sẽ cố gắng tìm ra giải pháp dựa trên phong nha numpy
cho nó.
Cập nhật:
Dưới đây là một số cách đơn giản mã cho ngã tư cầu ray:
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)
Rõ ràng chúng ta tính toán một cách chính xác:
In []: allclose(mag(X- c), r)
Out[]: True
Và một số timings:
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
Những thời gian được thực hiện với máy rất khiêm tốn. Với máy móc hiện đại, một tốc độ đáng kể có thể vẫn được mong đợi.
Dù sao, đây chỉ là một minh chứng ngắn về cách mã hóa với numpy
.
Suy nghĩ nhanh: 'numpy.array' thực sự là cấu trúc dữ liệu phức tạp hơn danh sách. Và trong đoạn thứ hai, bạn tạo một danh sách ** và ** một mảng numpy (chỉ trong danh sách đầu tiên). Cho dù đây là lý do duy nhất cho sự khác biệt lớn như vậy, tôi không thể nói. –
@Felix: ok, nhưng việc tạo danh sách rất nhanh, vì vậy ngay cả khi tôi tạo danh sách và mảng có nhiều mảng trong trường hợp thứ hai, nó vẫn là sự sáng tạo gọn gàng đó là điểm nóng ở đây và bất kể cấu trúc có thể phức tạp đến mức nào được, nó vẫn còn damn đắt tiền ... –
Nhưng hãy xem xét: Tạo dữ liệu hiếm khi là nút cổ chai trong một ứng dụng phức tạp đến mức nó sử dụng cục bộ.Tôi không biết điều gì xảy ra dưới mui xe, nhưng rõ ràng là làm cho các chương trình toán học nặng hơn vào cuối ngày, vì vậy không có lý do gì để khiếu nại;) – delnan