我只是想知道是否有更高效的方法来编写以下循环,因为我需要加速我的程序?
for char in data:
if char in self.key:
match += chr(self.key.index(char))
提前感谢您的帮助。
答案 0 :(得分: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()
调用移至列表推导。
答案 1 :(得分: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)
答案 2 :(得分:3)
match = ''.join(char for char in data if char in self.key)