1

辞書の型を持っています (例)

l =('1037_97',["a","b","c","d","e"])

ファイル (las 形式) を保存したいのですが、Liblas では1 つのポイントしか書き込めません。

for l in Groups.iteritems():
    for p in xrange(len(l[1])):
        file_out.write(l[1][p])

コードを保存してループを高速化するために、可能であればリスト内包表記を使用しようとしています

4

2 に答える 2

9

ループ内包表記は必ずしもループを高速化するとは限りません。最終結果がリストになる場合にのみ、ループを高速化します。リスト内包表記は、空のリストを作成して 1 つずつ追加するよりも高速です。

あなたの場合、アイテムをファイルに書き込み、新しいリストを作成したくありません。リストの作成コストが無駄になります。

xrange()ただし、呼び出しは必要ありません。ループするだけl[1]です。.iteritems()キーを無視するため、どちらも必要ありません。.itervalues()代わりに使用してください:

for lst in Groups.itervalues():
    for p in lst:
        file_out.write(p)

lstループ変数として使用しました。多くのフォントでl混同されやすいです。i

于 2013-02-11T15:29:41.073 に答える
4

より短いソリューションが必要な場合はmap()、内側のサイクル、またはその両方に使用することを検討してください。しかし、パフォーマンスが大幅に向上する可能性は低いです。ただし、for p in l[1]:それでもxrange. 次の例では、必要なことを 1 行で行う必要があります。

map(lambda g: map(file_out.write, g), groups.itervalues())

それでは、さまざまな実装のパフォーマンスを比較してみましょう。ここで、いくつかのテストデータで時間を測定しようとしました:

import timeit

groups = dict(('1037_%d' % i, ["a","b","c","d","e"]) for i in xrange(100))

class FOut(object):
    def write(self, v):
        #print v
        pass

file_out = FOut()

def using_map():
    map(lambda g: map(file_out.write, g), groups.itervalues())

def initial_version():
    for l in groups.iteritems():
        for p in xrange(len(l[1])):
            file_out.write(l[1][p])

def seq_iteration():
    for l in groups.iteritems():
        for p in l[1]:
            file_out.write(p)

def seq_iteration_values():
    for l in groups.itervalues():
        for p in l:
            file_out.write(p)

def list_compr():
    [[file_out.write(v) for v in g] for g in groups.itervalues()]



tests = ('initial_version', 'using_map', 'seq_iteration', 'list_compr', 'seq_iteration_values')


for test in tests:
    print test, timeit.timeit('%s()'%test, 'from __main__ import %s'%test, number=10000)

結果は次のとおりです。

initial_version 0.862531900406
using_map 0.703296899796
seq_iteration 0.541372060776
list_compr 0.632550954819
seq_iteration_values 0.493131160736

ご覧のとおり、最初のバージョンは最も遅く、反復を修正すると非常に役立ちます。map()バージョンは短いですが、itervalues(). 不要なリストを作成するリスト内包表記は悪くありませんが、単純なサイクルよりも遅くなります。

于 2013-02-11T15:47:17.233 に答える