ฉันขาดการออกแบบเชิงวัตถุและเชิงเวกเตอร์ ฉันชอบความสามารถโครงสร้างและความปลอดภัยที่วัตถุมอบให้กับสถาปัตยกรรมทั้งหมด แต่ในขณะเดียวกันความเร็วนั้นสำคัญมากสำหรับฉันและการมีตัวแปรลอยแบบง่าย ๆ ในอาเรย์ช่วยในภาษา / ไลบรารีที่ใช้เวกเตอร์เช่น Matlab หรือ numpy ใน Python
นี่คือส่วนหนึ่งของรหัสที่ฉันเขียนเพื่ออธิบายจุดของฉัน
ปัญหา: การเพิ่มหมายเลขความผันผวนของ Tow หาก 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 เป็นประเภทของรายการที่มีดัชนี) ตอนนี้ฉันต้องการเพิ่มทั้งสอง:
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 และรหัสอาจทำงานเร็วกว่าภาษาที่ใช้เวกเตอร์อยู่ดี แต่ไม่ thats จุด. ฉันต้องใช้ Python เพราะฉันมีโฮสต์ของไลบรารีที่ไม่สามารถใช้งานได้ในภาษาอื่น นั่นคือข้อ จำกัด ของฉัน ฉันต้องการเพิ่มประสิทธิภาพภายใน
และฉันก็รู้ว่าผู้คนจำนวนมากจะแนะนำให้ใช้การขนาน, gpgpu ฯลฯ แต่ฉันต้องการเพิ่มประสิทธิภาพการทำงานแบบแกนเดียวก่อนและจากนั้นฉันสามารถขนานทั้งสองรุ่นของรหัส
ขอบคุณล่วงหน้า!