Jestem rozdarty między projektowaniem obiektowym a projektowaniem wektorowym. Uwielbiam umiejętności, strukturę i bezpieczeństwo, jakie obiekty dają całej architekturze. Ale jednocześnie szybkość jest dla mnie bardzo ważna, a posiadanie prostych zmiennych zmiennoprzecinkowych w tablicy naprawdę pomaga w językach / bibliotekach wektorowych, takich jak Matlab lub numpy w Pythonie.
Oto fragment kodu, który napisałem, aby zilustrować mój punkt widzenia
Problem: Dodanie liczb zmienności Holowania. Jeśli x i y są dwiema liczbami zmienności, suma zmienności wynosi (x ^ 2 + y ^ 2) ^ 0,5 (przy założeniu pewnego warunku matematycznego, ale tutaj nie jest to ważne).
Chcę wykonać tę operację bardzo szybko, a jednocześnie muszę upewnić się, że ludzie nie dodają po prostu zmienności w niewłaściwy sposób (x + y). Oba są ważne.
Projekt oparty na OO wyglądałby mniej więcej tak:
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))
(Poza tym: dla tych, którzy są nowicjuszami w Pythonie, __add__
jest tylko funkcja, która zastępuje +
operatora)
Załóżmy, że dodałem listy holownicze wartości zmienności
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)))
(Poza tym: znowu, seria w Pythonie jest rodzajem listy z indeksem) Teraz chcę dodać dwa:
t1 = datetime.now()
vs3 = vs1 + vs2
t2 = datetime.now()
print t2-t1
Po prostu dodawanie działa na mojej maszynie w 3,8 sekundy, podane przeze mnie wyniki w ogóle nie uwzględniają czasu inicjalizacji obiektu, jest to tylko kod czasowy, który został odmierzony. Jeśli uruchomię to samo za pomocą tablic 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
Działa za 0,03 sekundy. To ponad 100 razy szybciej!
Jak widać, metoda OOP daje mi dużo bezpieczeństwa, że ludzie nie będą dodawać Zmienności w niewłaściwy sposób, ale metoda wektorowa jest po prostu szalona szybko! Czy istnieje projekt, w którym mogę uzyskać oba? Jestem pewien, że wielu z was wpadło na podobne wybory projektowe, jak to się udało?
Wybór języka tutaj jest nieistotny. Wiem, że wielu z was radziłoby używać C ++ lub Java, a kod może i tak działać szybciej niż języki oparte na wektorze. Ale nie o to chodzi. Potrzebuję użyć Pythona, ponieważ mam wiele bibliotek niedostępnych w innych językach. To moje ograniczenie. Muszę w nim zoptymalizować.
I wiem, że wiele osób sugerowałoby równoległość, gpgpu itp. Ale najpierw chcę zmaksymalizować wydajność jednego rdzenia, a następnie mogę zrównoleglić obie wersje kodu.
Z góry dziękuję!