Эффективно заменить строки в 20 000 потенциальных совпадений (Python) - PullRequest
0 голосов
/ 18 октября 2019

Я хочу заменить подстроки строки и хочу проверить на 20k + кандидатов.

Есть ли более эффективный способ, чем разделить 20k на подгруппы из 900 кандидатов и зациклить их?

Это моя функция:

def replaceNames(mailString, nameList, replacement=" Nachname"):
    anzNames = len(nameList)
    seq = np.arange(start=0, stop=anzNames, step=900).tolist()
    seq.append(anzNames)
    for i in range(0, len(seq) - 1):
        tempNamesString = "|".join(nameList[seq[i]:seq[i + 1]])
        mailString = re.sub(tempNamesString, replacement, mailString)
    return (mailString)

спасибо!

1 Ответ

0 голосов
/ 18 октября 2019

Мое предложение:

  1. Используйте string манипуляции вместо использования re (регулярное выражение), где это возможно, так как это быстрее.

    # Sample string of 1 million "my_rand_str"
    In [9]: x = ["my_rand_str"] * 1000000 
    
    In [10]: %%time                                                                                                             
        ...: replaced = [a.replace("str", "replaced") for a in x]                                                               
        ...:                                                                                                                    
        ...:                                                                                                                
    Wall time: 219 ms                                                                            
    
    In [11]: %%time                                                                                                             
        ...: replaced =  [re.sub("str", "replaced", a) for a in x]                                                             
        ...:                                                                                                                    
        ...:                                                                                                                
    Wall time: 1.33 s                                                                           
    
  2. Если вы настаиваете на использовании регулярного выражения, используйте предварительно скомпилированное регулярное выражение

    In [25]: tobe_replaced = re.compile("str")
    
    In [28]: %%time
        ...: replaced = [tobe_replaced.sub("replaced", a) for a in x]
        ...:
        ...:
        ...:
    Wall time: 1.02 s
    
  3. Если возможно, сделайте это вместо одной большой строкизацикливание, поскольку цикл дороже.

    In [29]: %%time
        ...: replaced = tobe_replaced.sub("replaced", "\n".join(x)).split("\n")
        ...:
        ...:
    Wall time: 291 ms
    
    In [30]: %%time
        ...: replaced = "\n".join(x).replace("str", "replaced").split("\n")
        ...:
        ...:
        ...:
    Wall time: 132 ms
    

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...