Python循环效率

时间:2013-08-31 16:34:57

标签: python performance loops

我只是想知道是否有更高效的方法来编写以下循环,因为我需要加速我的程序?

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

提前感谢您的帮助。

3 个答案:

答案 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)