I was just wondering if there is a more cpu efficient way of writing the following loop as I need to speed my program up?
for char in data:
if char in self.key:
match += chr(self.key.index(char))
Thanks in advance for any help.
I was just wondering if there is a more cpu efficient way of writing the following loop as I need to speed my program up?
for char in data:
if char in self.key:
match += chr(self.key.index(char))
Thanks in advance for any help.
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()
调用移动到列表理解。
是的,使用字典而不是列表。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)
match = ''.join(char for char in data if char in self.key)