我陷入了面向对象和基于矢量的设计之间。我喜欢对象赋予整个建筑的能力,结构和安全性。但是同时,速度对我来说非常重要,并且在数组中具有简单的float变量确实对基于矢量的语言/库(例如Matlab或Python中的numpy)有所帮助。
这是我写来说明我的观点的一段代码
问题:添加拖车波动率数字。如果x和y是两个波动率数字,则波动率的总和为(x ^ 2 + y ^ 2)^ 0.5(假设有一定的数学条件,但在这里并不重要)。
我想非常快地执行此操作,同时我需要确保人们不要以错误的方式(x + 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))
(此外:对于那些不熟悉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)))
(此外:同样,Python中的系列是带有索引的列表)现在我想添加两个:
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方法为我提供了很多安全性,人们不会以错误的方式添加Volatility,但是vector方法是如此之快!有没有我可以兼得的设计?我敢肯定,你们中很多人都遇到过类似的设计选择,您是如何实现的呢?
这里的语言选择无关紧要。我知道很多人建议使用C ++或Java,并且无论如何,这些代码的运行速度可能比基于矢量的语言要快。但这不是重点。我需要使用Python,因为我有许多其他语言都没有的库。那是我的约束。我需要在其中进行优化。
而且我知道,很多人会建议并行化,gpgpu等。但是我想先最大化单核性能,然后才能并行化两个代码版本。
提前致谢!