3

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.

4

3 回答 3

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()调用移动到列表理解。

于 2013-08-31T16:39:15.220 回答
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)
于 2013-08-31T16:39:03.987 回答
3
match = ''.join(char for char in data if char in self.key)
于 2013-08-31T16:35:46.293 回答