객체 지향 디자인과 벡터 기반 디자인 사이에서 찢어졌습니다. 나는 객체가 전체 아키텍처에 부여하는 능력, 구조 및 안전을 좋아합니다. 그러나 동시에 속도는 나에게 매우 중요하며 배열에 간단한 float 변수를 사용하면 Matlab 또는 Python의 numpy와 같은 벡터 기반 언어 / 라이브러리에서 실제로 도움이됩니다.
여기 내 요점을 설명하기 위해 작성한 코드가 있습니다.
문제 : 견인 변동성 수치 추가. x와 y가 2 개의 변동성 수인 경우, 변동성의 합은 (x ^ 2 + y ^ 2) ^ 0.5입니다 (특정 수학 조건을 가정하지만 여기서는 중요하지 않음).
이 작업을 매우 빠르게 수행하고 싶으며 동시에 사람들이 잘못된 방식으로 변동성을 추가하지 않도록해야합니다 (x + y). 둘 다 중요합니다.
OO 기반 디자인은 다음과 같습니다.
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))
(외부 : Python을 처음 사용하는 사람들에게는 연산자 __add__
를 재정의하는 함수 일뿐입니다 +
)
변동성 가치의 견인 목록을 추가한다고 가정 해 봅시다.
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)))
(제외 : 다시 말하지만, 파이썬의 시리즈는 인덱스가있는 목록입니다.) 이제 두 가지를 추가하고 싶습니다.
t1 = datetime.now()
vs3 = vs1 + vs2
t2 = datetime.now()
print t2-t1
내 컴퓨터에서 3.8 초 만에 추가가 실행되므로 결과에 객체 초기화 시간이 포함되지 않으며 시간이 지정된 추가 코드 만 포함됩니다. 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
0.03 초 안에 실행됩니다. 100 배 이상 빠릅니다!
보시다시피, OOP 방식은 사람들이 휘발성을 잘못된 방식으로 추가하지 않을 것이라는 많은 보안을 제공하지만 벡터 방법은 너무 빠릅니다! 둘 다 얻을 수있는 디자인이 있습니까? 많은 디자인이 비슷한 디자인을 선택했다고 확신합니다. 어떻게 해결 했습니까?
여기서 언어의 선택은 중요하지 않습니다. C ++ 또는 Java를 사용하는 것이 좋습니다. 어쨌든 코드는 벡터 기반 언어보다 빠르게 실행될 수 있습니다. 그러나 그것은 요점이 아닙니다. 다른 언어로는 사용할 수없는 라이브러리가 많기 때문에 Python을 사용해야합니다. 이것이 나의 제약입니다. 그 안에서 최적화해야합니다.
그리고 많은 사람들이 병렬화, gpgpu 등을 제안한다는 것을 알고 있습니다. 그러나 먼저 단일 코어 성능을 최대화하고 나서 두 버전의 코드를 병렬화 할 수 있습니다.
미리 감사드립니다!