Tôi bị giằng xé giữa thiết kế hướng đối tượng và vector. Tôi yêu các khả năng, cấu trúc và sự an toàn mà các đối tượng mang lại cho toàn bộ kiến trúc. Nhưng đồng thời, tốc độ rất quan trọng đối với tôi và việc có các biến float đơn giản trong một mảng thực sự giúp ích cho các ngôn ngữ / thư viện dựa trên vectơ như Matlab hoặc numpy trong Python.
Đây là một đoạn mã tôi đã viết để minh họa quan điểm của mình
Vấn đề: Thêm số biến động Tow. Nếu x và y là hai số biến động, tổng của độ biến động là (x ^ 2 + y ^ 2) ^ 0,5 (giả sử điều kiện toán học nhất định nhưng điều đó không quan trọng ở đây).
Tôi muốn thực hiện thao tác này rất nhanh, đồng thời tôi cần đảm bảo rằng mọi người không chỉ thêm biến động sai cách (x + y). Cả hai điều này đều quan trọng.
Thiết kế dựa trên OO sẽ giống như thế này:
from datetime import datetime
from pandas import *
class Volatility:
def __init__(self,value):
self.value = value
def __str__(self):
return "Volatility: "+ str(self.value)
def __add__(self,other):
return Volatility(pow(self.value*self.value + other.value*other.value, 0.5))
(Ngoài ra: Đối với những người mới sử dụng Python, __add__
chỉ là một chức năng ghi đè +
toán tử)
Giả sử tôi thêm danh sách kéo các giá trị biến động
n = 1000000
vs1 = Series(map(lambda x: Volatility(2*x-1.0), range(0,n)))
vs2 = Series(map(lambda x: Volatility(2*x+1.0), range(0,n)))
(Ngoài ra: Một lần nữa, Sê-ri trong Python là một danh sách có chỉ mục) Bây giờ tôi muốn thêm hai:
t1 = datetime.now()
vs3 = vs1 + vs2
t2 = datetime.now()
print t2-t1
Chỉ cần phần bổ sung chạy trong 3,8 giây trên máy của tôi, kết quả tôi đã đưa ra không bao gồm thời gian khởi tạo đối tượng, chỉ có mã bổ sung đã được tính thời gian. Nếu tôi chạy điều tương tự bằng cách sử dụng mảng numpy:
nv1 = Series(map(lambda x: 2.0*x-1.0, range(0,n)))
nv2 = Series(map(lambda x: 2.0*x+1.0, range(0,n)))
t3 = datetime.now()
nv3 = numpy.sqrt((nv1*nv1+nv2*nv2))
t4 = datetime.now()
print t4-t3
Nó chạy trong 0,03 giây. Điều đó nhanh hơn gấp 100 lần!
Như bạn có thể thấy, cách OOP mang lại cho tôi rất nhiều sự bảo mật mà mọi người sẽ không thêm Biến động sai cách, nhưng phương pháp vectơ thì quá nhanh! Có một thiết kế trong đó tôi có thể nhận được cả hai? Tôi chắc chắn rất nhiều bạn đã chạy vào các lựa chọn thiết kế tương tự, làm thế nào bạn tìm ra nó?
Sự lựa chọn ngôn ngữ ở đây là không quan trọng. Tôi biết nhiều bạn sẽ khuyên rằng nên sử dụng C ++ hoặc Java và mã có thể chạy nhanh hơn các ngôn ngữ dựa trên vector. Nhưng đó không phải là vấn đề. Tôi cần sử dụng Python, vì tôi có một loạt các thư viện không có sẵn bằng các ngôn ngữ khác. Đó là hạn chế của tôi. Tôi cần phải tối ưu hóa trong đó.
Và tôi biết rằng, rất nhiều người sẽ đề xuất song song hóa, gpgpu, v.v. Nhưng tôi muốn tối đa hóa hiệu suất lõi đơn trước, và sau đó tôi có thể song song cả hai phiên bản mã.
Cảm ơn trước!