1

これは、辞書内包表記と辞書内包表記内のリスト内包表記で set()を使用した場合のパフォーマンスと、新しい辞書への割り当ての繰り返しについての質問です。

したがって、たまたまリストのリストであるデータセットがあり、新しい辞書を作成できるように、ビッグリスト内の各リストで「0」でインデックス付けされた要素の一意のリストを取得する必要がありますそれらから.. dict.fromkeys() のようなもの.. ここで、一意のキーのリストを提供する必要があります..

私は使用しています

[1]{ x : [] for x in set([i[0] for i in data])}

また、

[2]{ i[0] : [] for i in data}

ここで参照するサンプル データは次のようになります。 [[1,3,4], [3,5,2], [1,5,2]]

上記の [1] と [2] を実行した結果は次のようになります。 { 1:[], 3: [] }

両方のステートメントで %timeit を試してみましたが、両方ともほぼ同じ結果が得られたため、リストの大きなリストの場合、パフォーマンスに関してどちらが最適かを特定するのが難しくなっています

ここで潜在的なボトルネックを特定するにはどうすればよいですか?

編集:

これが結果の説明に役立つ場合..

In [172]: data_new = data * 10000

In [173]: %timeit { i[0] : [] for i in data_new}
10 loops, best of 3: 160 ms per loop

In [174]: %timeit { x : [] for x in set([i[0] for i in data_new])}
10 loops, best of 3: 131 ms per loop

In [175]: data_new = data * 100000

In [176]: %timeit { x : [] for x in set([i[0] for i in data_new])}
1 loops, best of 3: 1.37 s per loop

In [177]: %timeit { i[0] : [] for i in data_new}
1 loops, best of 3: 1.58 s per loop

In [178]: data_new = data * 1000000

In [179]: %timeit { i[0] : [] for i in data_new}
1 loops, best of 3: 15.8 s per loop

In [180]: %timeit { x : [] for x in set([i[0] for i in data_new])}
1 loops, best of 3: 13.6 s per loop
4

2 に答える 2

4

より大きなデータセットを構築してから、時間を計ります。

コード:

import random
data = [ [random.randint(1, 9) for _ in range(3)] for _ in range(1000000)]

タイミング:

%timeit { x : [] for x in set([i[0] for i in data])}
# 10 loops, best of 3: 94.6 ms per loop
%timeit { i[0] : [] for i in data}
# 10 loops, best of 3: 106 ms per loop
%timeit { x: [] for x in set(i[0] for i in data)}
# 10 loops, best of 3: 114 ms per loop
%timeit { x: [] for x in {i[0] for i in data}}
# 10 loops, best of 3: 77.7 ms per loop

根拠:

最初に利用可能なキー空間を制限するということは、ディクショナリが (randint上記を考慮して) 9 つの一意のキーを 9 つの新しいリストに割り当てるだけでよいことを意味します。辞書構成を使用する場合、辞書はそのキーの値を繰り返し作成し、新しく作成されたリストに再割り当てする必要があります...違いは、破棄された空のリスト (ガベージ コレクション) の割り当て解除のオーバーヘッドと、それに費やされる時間です。新しい空のリストを作成します。

からの一様分布を考えると、randint1,000,000 個の要素のセットに対して 9 つの一意の値に対して 111,111 回の空のリストの割り当てと割り当て解除があります。

于 2015-01-28T13:56:11.690 に答える