2012-01-12 10 views
0

スレッドまたはマルチプロセッシングなしですばやく終了するには、次のコードが必要です。誰かが非常に感謝されるどんなトリックを知っていれば。多分for i in enumerate()か、計算する前にリストを文字列に変更すると、わかりません。
以下の例では、ランダムシーケンスを使用して変数を再作成しようとしましたが、これはループ内のいくつかの条件を無駄にしています...この例では大丈夫です。コードは少し長くかかります。 現在、私のi7では、以下の例(ほとんどの場合、条件の一部を迂回します)が1秒で完了します。できるだけ少なくしたいと思います。 ListVarの浅いコピーを作成Pythonの場合、次のコードが必要です。

import random 
import time 
import collections 
import cProfile 


def random_string(length=7): 
    """Return a random string of given length""" 
    return "".join([chr(random.randint(65, 90)) for i in range(length)]) 

LIST_LEN = 18400 
original = [[random_string() for i in range(LIST_LEN)] for j in range(6)] 
LIST_LEN = 5 
SufxList = [random_string() for i in range(LIST_LEN)] 
LIST_LEN = 28 
TerminateHook = [random_string() for i in range(LIST_LEN)] 
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Exclude above from benchmark 


ListVar = original[:] 
for b in range(len(ListVar)): 
    for c in range(len(ListVar[b])): 

     #If its an int ... remove 
     try: 
      int(ListVar[b][c].replace(' ', '')) 
      ListVar[b][c] = '' 
     except: pass 

     #if any second sufxList delete 
     for d in range(len(SufxList)): 
      if ListVar[b][c].find(SufxList[d]) != -1: ListVar[b][c] = '' 

     for d in range(len(TerminateHook)): 
      if ListVar[b][c].find(TerminateHook[d]) != -1: ListVar[b][c] = '' 
    #remove all '' from list 
    while '' in ListVar[b]: ListVar[b].remove('') 

print(ListVar[b]) 
+0

(リスト内すなわち見つけるmstrings):一緒にこれらの提案を置く

のようなものを提供します。私はそれに 'swig'を使います。また、おそらくリストの代わりにハッシュが速くなるでしょう –

+0

解決しようとしている問題を説明できますか?コードを理解してより良い方法を考え出すよりも、 "効率的な方法は何ですか"という質問に簡単に答えることができます。 – thesamet

+0

ろ過プロセスを通してリストを実行したい – Rhys

答えて

3
ListVar = original[:] 

は、その第二レベルのリストへの変更も元に影響を与えるしようとしています。あなたはそれがあなたが望むものだと確信していますか?新しい修正リストを最初から構築するほうがずっと良いでしょう。

for b in range(len(ListVar)): 
    for c in range(len(ListVar[b])): 

ヤック:できる限り、リストの直ぐ上で繰り返します。

 #If its an int ... remove 
     try: 
      int(ListVar[b][c].replace(' ', '')) 
      ListVar[b][c] = '' 
     except: pass 

数値の途中のスペースを無視しますか?それは正しいとは言えません。数字が負の数になる場合はtry..exceptを使用することができますが、正の数だけの場合は.isdigit()を使用してください。

 #if any second sufxList delete 
     for d in range(len(SufxList)): 
      if ListVar[b][c].find(SufxList[d]) != -1: ListVar[b][c] = '' 

それはちょうど悪い命名ですか? SufxListは、接尾辞を探していることを意味します。もしそうならば、.endswith()を使用してください(ループを避けるためにタプルを渡すことができます)。あなたが本当に接尾辞が文字列内のどこにでもあることを見つけたい場合は、inオペレータを使用します。

 for d in range(len(TerminateHook)): 
      if ListVar[b][c].find(TerminateHook[d]) != -1: ListVar[b][c] = '' 

再度、in演算子を使用してください。ここでもany()が便利です。

#remove all '' from list 
    while '' in ListVar[b]: ListVar[b].remove('') 

while、すなわち、それは遅いであろうO(N^2)です。ブランクを取り除く代わりにリストの理解を使うことができますが、最初にクリーンリストを作成するほうが良いでしょう。

print(ListVar[b]) 

あなたのインデントが間違っていると思います。あなたがCにあなたのコードの一部を書き換えることを試みることができ

suffixes = tuple(SufxList) 
newListVar = [] 
for row in original: 
    newRow = [] 
    newListVar.append(newRow) 
    for value in row: 
     if (not value.isdigit() and 
      not value.endswith(suffixes) and 
      not any(th in value for th in TerminateHook)): 
      newRow.append(value) 

    print(newRow) 
+0

偉大なフィードバックに感謝 – Rhys

関連する問題