vector3dPerf
ΒΆ
Performance check of Vector3d [] access.
setup 0. Direct access is by accessing .x .y or .z setup 1. ifel is an algorithm using if-elif statement. setup 2. set is instance set and access by index.
0 is obviously the fastest. Comparing 1 and 2, 1 is faster by ~10% on average. Comparing 0 and 1, 0 is double by a factor of 2.
''' Performance check of Vector3d [] access.
setup 0. Direct access is by accessing .x .y or .z
setup 1. ifel is an algorithm using if-elif statement.
setup 2. set is instance set and access by index.
0 is obviously the fastest.
Comparing 1 and 2, 1 is faster by ~10% on average.
Comparing 0 and 1, 0 is double by a factor of 2.
'''
import numpy
defclass = '''
import random
class V:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
class V1(V):
def __getitem__(self, idx):
if idx == 0:
return self.x
elif idx == 1:
return self.y
elif idx == 2:
return self.z
else:
raise IndexError()
class V2(V):
def __getitem__(self, idx):
return (self.x, self.y, self.z)[idx]
'''
import timeit
setup0 = ''' %s
def getting():
v = V1(random.random(), random.random(), random.random())
vv = (v.x, v.y, v.z)
''' % defclass
setup1 = ''' %s
def getting():
v = V1(random.random(), random.random(), random.random())
vv = (v[0], v[1], v[2])
''' % defclass
setup2 = ''' %s
def getting():
v = V2(random.random(), random.random(), random.random())
vv = (v[0], v[1], v[2])
''' % defclass
def main():
t = timeit.Timer('getting()', setup0)
res0 = numpy.array(t.repeat(20, 10000))
print("Direct access:")
print(res0)
print('*'*70)
t = timeit.Timer('getting()', setup1)
res1 = numpy.array(t.repeat(20, 10000))
print("If-elif statement access:")
print(res1)
print('*'*70)
t = timeit.Timer('getting()', setup2)
res2 = numpy.array(t.repeat(20, 10000))
print("Set instance:")
print(res2)
print('*'*70)
print("Direct: max=%.4f min=%.4f ave=%.4f med=%.4f" % (res0.max(), res0.min(), numpy.average(res0), numpy.median(res0)))
print("ifel : max=%.4f min=%.4f ave=%.4f med=%.4f" % (res1.max(), res1.min(), numpy.average(res1), numpy.median(res1)))
print("set : max=%.4f min=%.4f ave=%.4f med=%.4f" % (res2.max(), res2.min(), numpy.average(res2), numpy.median(res2)))
if __name__ == '__main__':
main()