より短いソリューションが必要な場合は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()
. 不要なリストを作成するリスト内包表記は悪くありませんが、単純なサイクルよりも遅くなります。