Python 3.x заменит цикл чем-то более быстрым - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь создать вектор, который представляет совпадение строки и элементов списка.Я сделал функцию в python3.x:

def vector_build (docs, var):
    vector = []
    features = docs.split(' ')
    for ngram in var:            
        if ngram in features:
            vector.append(docs.count(ngram))
        else:
            vector.append(0)
    return vector

Работает нормально:

vector_build ('hi my name is peter',['hi', 'name', 'are', 'is'])

Out: [1, 1, 0, 1]

Но эта функция не масштабируется до значимых данных.Когда его строковый параметр 'docs' тяжелее 190 КБ, это занимает больше времени.Поэтому я пытаюсь заменить цикл for функцией map, например:

var = ['hi', 'name', 'are', 'is']
doc = 'hi my name is peter'
features = doc.split(' ')
vector = list(map(var,if ngram in var in features: vector.append(doc.count(ngram))))

Но это возвращает эту ошибку:

SyntaxError: неверный синтаксис

Есть ли способ заменить цикл for на map, lambda, itertools, чтобы ускорить выполнение?

1 Ответ

0 голосов
/ 06 декабря 2018

Вы можете использовать понимание списка для этой задачи.Кроме того, поиск в наборе функций должен помочь некоторым функциям.

var = ['hi', 'name', 'are', 'is']
doc = 'hi my name is peter'
features = doc.split(' ')
features_set = set(features) #faster lookups
vector = [doc.count(ngram) if ngram in features_set else 0 for ngram in var] 
print(vector)
...