Python, мне нужен следующий код, чтобы закончить быстрее - PullRequest
0 голосов
/ 12 января 2012

Мне нужен следующий код, чтобы закончить быстрее без потоков или многопроцессорности.Если кто-нибудь знает какие-либо хитрости, которые будут с благодарностью.может быть for i in enumerate() или изменение списка на строку перед вычислением, я не уверен.
В приведенном ниже примере я попытался воссоздать переменные, используя случайную последовательность, однако это привело к некоторым условиям внутрицикл бесполезен ... что нормально для этого примера, это просто означает, что «истинное» приложение для кода займет немного больше времени.В настоящее время на моем i7, приведенный ниже пример (который в основном будет обходить некоторые из его условий) завершается за 1 секунду, я хотел бы уменьшить это как можно больше.

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

1 Ответ

3 голосов
/ 12 января 2012
ListVar = original[:]

Это делает поверхностную копию ListVar, поэтому ваши изменения в списках второго уровня также повлияют на оригинал. Вы уверены, что это то, что вы хотите? Гораздо лучше было бы создать новый модифицированный список с нуля.

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

Я думаю, возможно, ваш отступ был неправильным на этом отпечатке.

Объединение этих предложений дает примерно следующее:

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)
...