如何提高Python中迭代的速度?
我想知道你能不能帮我加快我的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]