我最近需要完成一个涉及多个坐标操作的任务。为了节省时间和简化代码,我定义了一个类来封装坐标对的行为。这个类看起来像这样:
class Vector (tuple) :
def __init__ (self, value) :
tuple.__init__ (self, value)
def __add__ (self, other) :
return Vector ((self [0] + other [0], self [1] + other [1]))
这使我能够编写如下代码(例如):
def translate (pointList, displacement) :
return [point + displacement for point in pointList]
但是我的应用程序非常慢,比其他任务慢得多。我在算法实现中找不到任何低效之处,所以我进行了一个简单的测试,看一下Vector类的开销。我预计会有5%至15%之间的开销。
我的Vector类测试代码如下:
v = Vector ((0, 0))
d = Vector ((1, -1))
loopIdx = 3000000
while loopIdx > 0 :
v = v + d
loopIdx -= 1
print (v)
这通常需要运行以下时间:
real 0m8.440s
user 0m8.367s
sys 0m0.016s
为了对比,我运行了这段代码:
v = (0, 0)
dX = 1
dY = -1
loopIdx = 3000000
while loopIdx > 0 :
v = ( v [0] + dX, v [1] + dY )
loopIdx -= 1
print (v)
这段代码的运行时间是:
real 0m1.004s
user 0m0.995s
sys 0m0.006s
我是否犯了什么严重错误,或者在Python中使用类对象真的意味着你的应用程序运行时间会延长8倍以上吗?
__slots__
的类来最小化每个实例的内存占用。 - jonrsharpe__init__
对于语义没有任何影响,但可以使得测试该类时提升60%的速度。 - user319799complex
的子类,那么你也必须重写所有其他方法,以返回你的子类而不是常规的complex
。考虑到巨大的加速效果,我认为这是一个你应该接受的妥协。 - tobias_k