我有一个很大的字符串列表(100万个元素)。仅举例:
largeList = ['abc','def','ghi','kkl_year12_month12']
我必须提取共享以下项目的字符串元素:
criteria_1 = ['year12', 'year14'] ##in my real case they are 2 thousands.
criteria_2 = 'month12' ##in my real case it is just one.
我做了如下:
answer = [x for x in largeList if any(y in x for y in criteria_1) and 'month12' in x]
但我的方法非常慢。
任何提高速度的想法?
答案 0 :(得分:1)
根据criteria_2
筛选过滤的元素数量,您首先可以提高largeList的速度。
>>> def find1(largelist1,crit1,crit2):
>>> return [x for x in largeList if any(y in x for y in crit1) and crit2 in x]
>>> def find2(largelist1,crit1,crit2):
>>> filt_l = (x for x in largelist1 if crit2 in x)
>>> return [x for x in filt_l if any(y in x for y in crit1)]
>>> %timeit find1(largeList,criteria_1,criteria_2)
100000 loops, best of 3: 2.18 µs per loop
>>> %timeit find2(largeList,criteria_1,criteria_2)
1000000 loops, best of 3: 1.39 µs per loop
另外,它可能有助于使用numpys数组。
答案 1 :(得分:1)
其他答案建议首先检查第二个标准(因为这是最简单,因此最快的检查)。这也可以通过更改and
关键字周围条件的顺序来完成:
answer = [x for x in largeList if 'month12' in x and any(y in x for y in criteria_1)]
如果'month12 in x'
产生错误,则不会评估第二个标准any(y in x for y in criteria_1)
。