任何想法如何提高从大型字符串列表中选择元素的速度

时间:2014-11-10 08:03:25

标签: python list numpy

我有一个很大的字符串列表(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]

但我的方法非常慢。

任何提高速度的想法?

2 个答案:

答案 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)