2

私は多くの文字列フォーマットを行う必要のあるプログラムを書いていますが、それ.format()はわずかですがかなりのcpu時間を要していることに気づきました。これが私がそれをどのように使用しているかです:

str = 'vn {0:.15f} {1:.15f} {2:.15f}\n'.format(normal_array[i].x, normal_array[i].y, normal_array[i].z)

X 100000のごく一部が合計される可能性があるため、これを行うための少しでも速い方法があるかどうかを誰かが知っていますか?

4

4 に答える 4

4

式に置き換え.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
于 2012-08-11T11:39:40.430 に答える
4

また、に移行してみることができます。cpythonとPyPyでの文字列フォーマットの比較に関する記事PyPyがありました。

于 2012-08-11T11:46:39.227 に答える
2

formatディレクティブに置き換えて、この(古い学校の)アプローチを試してください.format()%

str = 'vn %.15f %.15f %.15f\n' % (normal_array[i].x, normal_array[i].y, normal_array[i].z )          

使用%する方が速いようです:

timeit str='%.15f %.15f %.15f\n' % (a, b, c)
100000 loops, best of 3: 4.99 us per loop

timeit str2='{:.15f} {:.15f} {:.15f}\n'.format(a, b, c)
100000 loops, best of 3: 5.97 us per loop

XPSP2でのPythonv2.7.2、変数、、aおよびbc浮動小数点数です。

于 2012-08-11T11:37:48.643 に答える
1

フロート変換が依然としてボトルネックである場合は、フォーマットをにファームアウトして、またはをmultiprocessing.Pool使用して結果の文字列を印刷しようとする場合があります。これにより、マシン上のすべてのコアを使用してフォーマットが実行されます。異なるプロセスとの間でデータをやり取りすることによるオーバーヘッドが、改善者がフォーマットを並列化することを覆い隠している可能性があります。multiprocessing.map_asyncmultiprocessing.imap

于 2012-08-11T23:00:18.103 に答える