2012-01-12 44 views
0

我需要以下代码才能在没有线程或多处理的情况下更快完成。如果有人知道任何技巧,将不胜感激。也许for i in enumerate()或在计算之前将列表更改为字符串,我不确定。
对于下面的例子,我试图用随机序列重新创建变量,但是这已经使循环内部的一些条件无用......对于这个例子来说没问题,它只是意味着'真正'的应用程序代码会稍微延长一点。 目前在我的i7上,下面的示例(其中大部分将绕过其中的一些条件)在1秒内完成,我希望尽可能地降低它。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

你可以尝试重写代码的某些部分在C(在列表中找到,即mstrings)。我用'swig'。此外,也许哈希,而不是列表将更快 – 2012-01-12 08:47:04

+0

你能解释你想解决什么问题?我们更容易回答“什么是有效的X方法”这个问题,而不是理解你的代码并想出一个更好的方法来实现它。 – thesamet 2012-01-12 08:51:15

+0

我想通过过滤流程运行一个列表 – Rhys 2012-01-12 08:59:31

回答

3
ListVar = original[:] 

这使得ListVar的浅表副本,让你的第二个层次列表的变化将影响到原也。你确定这是你想要的吗?更好的做法是从头构建新的修改列表。

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

Yuck:尽可能在列表上直接迭代。

 #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]) 

我想也许你的缩进在那张印刷上是错误的。

把这些建议一起给出类似:

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 2012-01-12 19:07:26

相关问题