如何提高Python中迭代的速度?

2 投票
2 回答
2606 浏览
提问于 2025-04-17 13:14

我想知道你能不能帮我加快我的Python脚本的运行速度。

我有两个列表:

a=['a','b','c','d','e','f','g','h','i','j']

b=['b','f','g','j']

我想创建一个新的列表,这个列表要包含列表b中的元素,但长度要和列表a一样。列表b中没有的元素要用其他东西替代,比如说用'-999'。另外,我不想直接用元素的值(比如a、b、c……),而是想用这些元素在列表b中的索引来替代。所以最终的结果应该是这样的:

c=['-999',0,'-999','-999','-999', 1, 2,'-999','-999',3] 

我现在的代码是:

c=[]

counter=0

for each in a:
    if each in b:
        c.append(counter)
        counter+=1
    else:
        c.append('-999')

这个代码运行得很好,不过在实际情况中,我的列表a有60万个元素,而我还有7个列表b需要遍历,它们的长度在3000到25万个元素之间。

有没有什么办法可以加快这个过程呢?

2 个回答

0

更简单的东西:

a=['a','b','c','d','e','f','g','h','i','j']

b=['b','f','g','j']

for i,x in enumerate(a):
    a[i] = b.index(x) if x in b else -999

输出结果:

[-999, 0, -999, -999, -999, 1, 2, -999, -999, 3]

分析:

原作者的方法:

>>> 
len(a) = 10000
len(b) = 5000
Time = 0:00:01.063000

方法一:

c=[]
for i,x in enumerate(a):
    c.append(b.index(x) if x in b else -999)

>>> 
len(a) = 10000
len(b) = 5000
Time = 0:00:01.109000

Ashwini Chaudhary的方法:

>>> 
len(a) = 10000
len(b) = 5000
Time = 0:00:00
6

如果b里的元素都是独一无二的,你可以试试这个方法:

In [76]: a=['a','b','c','d','e','f','g','h','i','j']

In [77]: b=['b','f','g','j']

In [78]: dic={x:i for i,x in enumerate(b)}

In [79]: dic
Out[79]: {'b': 0, 'f': 1, 'g': 2, 'j': 3}

In [81]: [dic.get(x,'-999') for x in a]
Out[81]: ['-999', 0, '-999', '-999', '-999', 1, 2, '-999', '-999', 3]

如果有重复的元素,你可以使用defaultdict(list)

In [102]: a=['a','b','c','d','e','f','g','b','h','i','f','j']

In [103]: b=['b','f','g','j','b','f']

In [104]: dic=defaultdict(list)

In [105]: for i,x in enumerate(b):
    dic[x].append(i)
   .....:     

#now convert every value(i.e list) present in dic to an iterator.

In [106]: dic={x:iter(y) for x,y in dic.items()}  

In [107]: [next(dic[x]) if x in dic else '-999' for x in a]  #call next() if the key 
                                                             #is present else use '-999'
Out[107]: ['-999', 0, '-999', '-999', '-999', 1, 2, 4, '-999', '-999', 5, 3]

撰写回答