2016-05-20 22 views
-5

サイズが約10,000のいくつかの大きなリストがいくつかあります。Python:リストのループ速度を向上させる

など。私のリストは以下のように見えるが、私の本当の人生リストはL1、L2、L3で約10,000の要素それぞれがあります。これらのリストは、1つのマッピングの一つです

L1 = ['A1','B1','A1','B1','A1','C1'] 
L2 = ['C1','C2','C3','C1','C2','C1'] 
L3 = [ 1, 2, 3, 1, 2, 2] 

を。

L1、L2、L3の要素の組み合わせに基づいて新しいリストを作成する必要があります。

私が作成しようとしています新たなリストは、次のコードをしています

TypeDefn = ['Type1' if (x == 'A1' and y>=1 and y<=3) 
       else 'Type1' if (z == 'C1' and y>=1 and y<=3) 
       else 'Type2' if (x== 'A2' and y>=0 and y<7) 
       else 'Type3' for x in L1 for y in L3 for z in L2] 

明らかに私の場合コードの10000^3回を反復処理する必要があり、それは、最適なソリューションではありません。

どのような方法がありますか?

編集: 質問に答えることが難しい場合、なぜ人々はそれをダウン投票するのですか? Downvoteは私が実際にこの質問にdownvoteのポイントを見逃しているコメントの原因で義務付けられるべきです。この世界のすべての問題が決定論的な解決策を持っているわけではありません。

@Sniggerfardimungusコメントは必ずしも私の問題を解決しませんが、それは私に洞察を与えます。

+1

私はしばらく見てきた最も読めないコードです。なぜ、最初のケースで 'またはz == 'C1'だけでなく、2番目のケースを削除するのでしょうか?また、 '1 <= y <= 3'はあなたの' y> = 1とy <= 3'と同じです –

+0

申し訳ありませんが、これをイラストとして書いたのですが、もっと多くの変数とその相互作用も非常に複雑です。しかし、私が尋ねるポイントは、3つ以上のリストを効率的に反復処理して型定義を作成する方法です。 – Zanam

+1

まず最初に、結果に適したフォームを選択する必要があります。各リストに10,000要素がある場合、 'TypeDefn'は10 ** 12、つまり1,000,000,000,000要素になります。それは1つの三柱です。そう、いいえ。これはアルゴリズムの問​​題ではなく、仕様の問題です。定義されているように 'TypeDefn'を持つことはできません。代わりに何を作りたいですか?どのように使用するのか自分自身に尋ねてください。 –

答えて

1
TypeDefn = ['Type1' if (y>=1 and y<=3) and (x == 'A1' or z == 'C1') else 
      'Type2' if (.........) else 'Type3' for x......] 

実際のパフォーマンスの問題はループの実行時間ではありませんが、メモリの問題になりますが、これ以上の改善は得られません。あなたは10000^3のすべての組み合わせを処理しなければならないので、あなたは何でもO(n^3)です。それを改善するアルゴリズムはありません。

自分で保存できるのは、計算結果をディスクに書き出すことです。文字列( 'Type1'など)を個々のビットに置き換えます。 Pythonはこれらの文字列を何度も再利用することによってストレージを少しずつ圧縮しようとしますが、死刑判決を与えてもそれはおそらく魅力的ではありません。 L1、L2、L3で500エントリを入力してコードを実行してみてください。

import sys; print sys.getsizeof(small_version_of_data_storage_hell) 

あなたは何を意味するのでしょうか。私にとっては、それはギグを超えており、最終的なデータサイズの1/8000倍を話しています。 1兆の文字列の参照を格納するコンピュータがある場合は、ここでその文字列を最大限に活用しているわけではありません。 =]

このコードを実行したときに起こる可能性が最も高いのは一時停止し、マシンがクロールしているように見えてフリーズしているように見える場合、Pythonインタプリタがクラッシュして運がよければその運命に苦しむ唯一のものである。

によってではありません。これをすべてメモリに保存すると、キャッシングの動作が向上し、最終的には最終的には最終的に完了します。もちろん、結果リストで何をしようとしていたとしても、あなたが書いたファイルから処理する必要がありますが、選択肢はありません。

+0

データが1回だけ必要な場合は選択肢があります。ジェネレータを使用できます。 –

+1

@PadraicCunningham:非常に公正なポイント。彼が実際にリストを必要としないなら、彼が言ったように(私は彼がしないことをFSMに願っています)、発電機はより良い賭けになるかもしれません。もし彼が一度だけではなく、それを一度に使うのであれば、もっと良い賭けになるかもしれません。 – Sniggerfardimungus

関連する問題