numpy 在python中快速迭代大列表

vhmi4jdf  于 2023-03-08  发布在  Python
关注(0)|答案(1)|浏览(124)

我试图扫描一个包含100,000,000个字符串的列表(list1),并将其与另一个列表(list2)进行匹配,列表1可以包含多达1000万行,如果list2的内容在list1中,我将在计数器中标记这些值,并将结果存储在第三个列表中,因此我的列表大致如下:
列表1

['My name is ABC and I live in DEF',
'I am trying XYZ method to speed up my LMN problem'
... 100000 rows
]

列表2(长度90k)

['ABC','DEF','XYZ','LMN' ......XXX']

我已经将列表1转换为 Dataframe ,将列表2转换为连接列表(减少了传递次数)。

['ABC|DEF|XYZ...|XXX']

我想要的输出是:

['My name is ABC and I live in DEF',2] ( since I have two matching patterns with list2 )

我试过下面的代码,但是迭代df并给予结果花费了很多时间。你能告诉我如何让这段代码更快吗?我到底做错了什么?

import snowflake.connector
import pandas as pd
import numpy as np
my_list=[]
df_list1 = pd.DataFrame({'cola':cola_val})
for row in tqdm.tqdm(df_product_list.values):
    val= row[0]
    match_list = re.findall(SKU_LIST,str(val),re.IGNORECASE)
    my_list.append(str(val)+'~'+str(len(set(match_list))))
zc0qhyus

zc0qhyus1#

在您的情况下,regexp不是一个很好的选择,因为它的成本相当高,而且交替(..|..| 90K items)将导致大量的regex回溯。
预先将lst2转换为set对象,并找到每个拆分句子的交集:

def count_keys_within(lst1, lst2):
    keys = set(lst2)
    for s in lst1:
        yield [s, len(set(s.split()) & keys)]

counts = list(count_keys_within(lst1, lst2))
print(counts)

样本输出:

[['My name is ABC and I live in DEF', 2], ['I am trying XYZ method to speed up my LMN problem', 2]]
    • 更新:**如果句子有更复杂的分隔符(您提到了+),请使用预编译的正则表达式模式进行拆分,该模式可以使用其他额外的分隔符字符进行扩展:
def count_keys_within(lst1, lst2):
    keys = set(lst2)
    pat = re.compile(r'[\s+]')
    for s in lst1:
        yield [s, len(set(pat.split(s)) & keys)]

相关问题