我只是想知道是否有更多的CPU有效的方式來編寫下面的循環,因爲我需要加快我的程序?Python循環效率
for char in data:
if char in self.key:
match += chr(self.key.index(char))
在此先感謝您的幫助。
我只是想知道是否有更多的CPU有效的方式來編寫下面的循環,因爲我需要加快我的程序?Python循環效率
for char in data:
if char in self.key:
match += chr(self.key.index(char))
在此先感謝您的幫助。
替換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()
調用移動到列表理解。
只是有點困惑:爲什麼'match =''.join(數據中的字符的鍵[char],如果鍵中的字符)'工作?原諒我,如果這是我失蹤的一些愚蠢。 – iCodez
@iCodez:查看[list comprehension without \ [\],Python](http://stackoverflow.com/a/9061024)由於'str.join()'如何操作,列表comp比發生器表達式更有效。 –
感謝所有回覆的人。有很多選擇,Martijn的答案是最多的,因爲它的選票最多。所有那些提供其他偉大選擇的人也不要冒犯。這確實比我的嘗試快得多。再次感謝克林頓。 –
match = ''.join(char for char in data if char in self.key)
感謝所有回覆的人。有很多選擇,Martijn的答案是最多的,因爲它的選票最多。所有那些提供其他偉大選擇的人也不要冒犯。這確實比我的嘗試快得多。再次感謝克林頓。 –
是的,使用字典而不是列表。 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)
感謝所有回覆的人。有很多選擇,Martijn的答案是最多的,因爲它的選票最多。所有那些提供其他偉大選擇的人也不要冒犯。這確實比我的嘗試快得多。再次感謝克林頓。 –
@ViktorKerkez:在加入(...)'的情況下,使用列表理解實際上更快。 –
什麼是'self.key',一個列表? –