У меня есть цепочка for-loops, которая работает в исходном списке строк, а затем постепенно фильтрует список, когда он идет по цепочке, например:
import re
# Regex to check that a cap exist in string.
pattern1 = re.compile(r'\d.*?[A-Z].*?[a-z]')
vocab = ['dog', 'lazy', 'the', 'fly'] # Imagine it a longer list.
def check_no_caps(s):
return None if re.match(pattern1, s) else s
def check_nomorethan_five(s):
return s if len(s) <= 5 else None
def check_in_vocab_plus_x(s,x):
# s and x are both str.
return None if s not in vocab else s+x
slist = ['the', 'dog', 'jumps', 'over', 'the', 'fly']
# filter with check_no_caps
slist = [check_no_caps(s) for s in slist]
# filter no more than 5.
slist = [check_nomorethan_five(s) for s in slist if s is not None]
# filter in vocab
slist = [check_in_vocab_plus_x(s, str(i)) for i,s in enumerate(slist) if s is not None]
Это просто пример, и на самом деле мои функции манипулировать строками сложнее, но они возвращают исходную строку или управляемую.
Я мог бы использовать генераторы вместо списка и делать что-то вроде этого:
slist = ['the', 'dog', 'jumps', 'over', 'the', 'fly']
# filter with check_no_caps and no more than 5.
slist = (s2 check_no_caps(s1) for s1 in slist
for s2 in check_nomorethan_five(s1) if s1)
# filter in vocab
slist = [check_in_vocab_plus_x(s, str(i)) for i,s in enumerate(slist) if s is not None]
Или в одном сумасшедшем вложенном генераторе:
slist = ['the', 'dog', 'jumps', 'over', 'the', 'fly']
slist = (s3 check_no_caps(s1) for s1 in slist
for s2 in check_nomorethan_five(s1) if s1
for s3 in check_in_vocab_plus_x(s2, str(i)) if s2)
Должен быть лучший способ. Есть ли способ ускорить цепочку for-loop?
Есть ли способ сделать это с помощью map
, reduce
и filter
? Будет ли это быстрее?
Представьте, что мой оригинальный сланец очень велик, как 10 миллиардов. И мои функции не так просты, как функции выше, они выполняют некоторые вычисления и делают около 1000 вызовов в секунду.