gpt4 book ai didi

python - 面向对象与基于向量的编程

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:22 25 4
gpt4 key购买 nike

<分区>

我在面向对象设计和基于矢量的设计之间左右为难。我喜欢物体赋予整个建筑的能力、结构和安全性。但与此同时,速度对我来说非常重要,在数组中使用简单的浮点变量确实有助于基于矢量的语言/库,如 Matlab 或 Python 中的 numpy。

这是我写的一段代码来说明我的观点

问题:添加两个波动率数字。如果 x 和 y 是两个波动率数,则波动率之和为 (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)))

(旁白:同样,Python 中的 Series 是一种带有索引的列表)现在我想添加两个:

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 等。但我想首先最大化单核性能,然后我可以并行化两个版本的代码。

提前致谢!

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com