2013-08-31 88 views
3

我只是想知道是否有更多的CPU有效的方式來編寫下面的循環,因爲我需要加快我的程序?Python循環效率

for char in data: 
    if char in self.key: 
     match += chr(self.key.index(char)) 

在此先感謝您的幫助。

+0

什麼是'self.key',一個列表? –

回答

7

替換self.key與字典;它是根據列表進行的會員資格測試,以及造成您成績最高的.index()電話;都需要掃描整個列表。

使用str.join()連接一系列字符;該構建一個新的字符串對象,而不是N個新的對象:

keys = {char: chr(i) for i, char in enumerate(self.key)} 
match = ''.join([keys[char] for char in data if char in keys]) 

字典成員測試和查找是O(1)恆定成本;通過使用char(..)值構建字典,您可以避免多個chr()每個值的調用;取決於重新使用了多少個值,使用char: i代替它可能會更快,並將chr()調用移動到列表理解。

+0

只是有點困惑:爲什麼'match =''.join(數據中的字符的鍵[char],如果鍵中的字符)'工作?原諒我,如果這是我失蹤的一些愚蠢。 – iCodez

+0

@iCodez:查看[list comprehension without \ [\],Python](http://stackoverflow.com/a/9061024)由於'str.join()'如何操作,列表comp比發生器表達式更有效。 –

+0

感謝所有回覆的人。有很多選擇,Martijn的答案是最多的,因爲它的選票最多。所有那些提供其他偉大選擇的人也不要冒犯。這確實比我的嘗試快得多。再次感謝克林頓。 –

3
match = ''.join(char for char in data if char in self.key) 
+0

感謝所有回覆的人。有很多選擇,Martijn的答案是最多的,因爲它的選票最多。所有那些提供其他偉大選擇的人也不要冒犯。這確實比我的嘗試快得多。再次感謝克林頓。 –

4

是的,使用字典而不是列表。 index操作很慢(這是O(log(N))由於是檢查,如果該元素是在列表中,而字典訪問O(1)

self.map = dict(zip(self.key, range(len(self.key))) 
for char in data: 
    if char in self.map: 
     match += chr(self.map[char]) 

也改變了常數使用join和發電機添加到字符串只是一個字符串連接內部表達(避免列表創建):

result = ''.join(chr(self.map[char]) for char in data if char in self.map) 
+0

感謝所有回覆的人。有很多選擇,Martijn的答案是最多的,因爲它的選票最多。所有那些提供其他偉大選擇的人也不要冒犯。這確實比我的嘗試快得多。再次感謝克林頓。 –

+0

@ViktorKerkez:在加入(...)'的情況下,使用列表理解實際上更快。 –