式に置き換え.format
て、%
normal_arrayを事前に計算してみてください。
item = normal_array[i]
'vn %.15f %.15f %.15f\n' % (item.x, item.y, item.z)
また、インデックスを値の反復に置き換えると、速度がわずかに向上します。
for item in normal_array:
'vn %.15f %.15f %.15f\n' % (item.x, item.y, item.z)
基準:
def gen_data(n):
l = []
for k in xrange(n):
l.append(collections.namedtuple('normal', ('x', 'y', 'z'))(random.random(), random.random(), random.random()))
return l
if __name__ == '__main__':
times = 1000
print 'format:'
print timeit.Timer('for i in xrange(len(normal_array)):\n str = "vn {0:.15f} {1:.15f} {2:.15f}\\n".format(normal_array[i].x, normal_array[i].y, normal_array[i].z)\n',
'from __main__ import gen_data; normal_array = gen_data(1000)').timeit(times)
print '%s:'
print timeit.Timer('for i in xrange(len(normal_array)):\n str = "vn %.15f %.15f %.15f\\n".format(normal_array[i].x, normal_array[i].y, normal_array[i].z)\n',
'from __main__ import gen_data; normal_array = gen_data(1000)').timeit(times)
print '%s+iteration:'
print timeit.Timer('for o in normal_array:\n str = "vn %.15f %.15f %.15f\\n".format(o.x, o.y, o.z)\n',
'from __main__ import gen_data; normal_array = gen_data(1000)').timeit(times)
結果(低いほど良い)
format:
5.34718108177
%s:
1.30601406097
%s+iteration:
1.23484301567