2016-05-27 25 views
2

私はいくつかのコードがありますが、私はそれが本当に非効率であることを心配しています。 dictのリストを一種のバッファにチャンク化/バッチ化するよりパフォーマンスのよい方法がありますか?この例では効率的なリストコピー

rowA = {1:"a",2:"b",3:"c"}   # Random dict 
rowB = {4:"d",5:"e",6:"f"}   # Random dict 
rowC = {7:"g",8:"h",9:"i"}   # Random dict 
rowD = {0:"j",1:"k",2:"l"}   # Random dict 
rows = [rowA ,rowB ,rowC ,rowD ] # Add to a List 
row_chunk = []      # Empty List for buffer/cache 
row_count = 0      # Counter for buffer size 
for row in rows:       # Iterate over the list 
    row_chunk.append(list(row.values())) # Append the values from the dictionary 
    row_count += 1      # Increment the buffer size 
    if row_count % 2 == 0:    # Check if the buffer reached level 
     print("We have {0} dictionaries".format(len(row_chunk))) 
     row_chunk = []     # Reset the list 

、私は万のチャンクを持つことを期待して行は[]これは、ように見えるん述べたよう1,000,000エントリ

を持つことになり、生産2.の塊で番号のリストを破ります特にリストに追加してリセットすると、時間がかかり、効率が悪くなります。

もっと良いアプローチをアドバイスできますか?二つに、リストAを分割する

+1

なぜこのバッファを使用していますか? – BrenBarn

+0

'list(row.values()) 'を使用する特別な理由は何ですか? – Copperfield

+0

@BrenBarn - 特に理由はありません。これは、基本的にデータベースへの書き込みをバッファリングすることです。私は一度に行全体を提出しようとしていない限り、どのようにそれを分解するか気にしない。 – Exie

答えて

2

Part1=A[:len(A)/2] 
Part2=A[len(A)/2:] 

私はこれがあなたが必要とするすべてだと思う:

>>> for row in rows:       # Iterate over the list 
...  A.append(list(row.values())) 
... 
>>> A=row_chunk 
>>> B=A[:len(A)/2] 
>>> C=A[len(A)/2:] 
>>> A 
[['a', 'b', 'c'], ['d', 'e', 'f'], ['h', 'i', 'g'], ['j', 'k', 'l']] 
>>> B 
[['a', 'b', 'c'], ['d', 'e', 'f']] 
>>> C 
[['h', 'i', 'g'], ['j', 'k', 'l']] 

オルタナティブ:(ループを避け、直接値を取得することによって)

>>> rows = [rowA.values() ,rowB.values() ,rowC.values() ,rowD.values() ] # Add to a List 
>>> rows 
[['a', 'b', 'c'], ['d', 'e', 'f'], ['h', 'i', 'g'], ['j', 'k', 'l']] 
>>> A=rows[:len(rows)/2] 
>>> B=rows[len(rows)/2:] 
>>> A 
[['a', 'b', 'c'], ['d', 'e', 'f']] 
>>> B 
[['h', 'i', 'g'], ['j', 'k', 'l']]