【问题标题】:Python loop efficiencyPython循环效率
【发布时间】:2013-09-04 05:05:11
【问题描述】:

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

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

提前感谢您的帮助。

【问题讨论】:

  • 什么是self.key,一个列表?

标签: python performance loops


【解决方案1】:

替换 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(keys[char] for char in data if char in keys) 不起作用?如果我错过了什么愚蠢的事情,请原谅我。
  • @iCodez:请参阅list comprehension without [ ], Python 了解原因;由于str.join() 操作列表comp 的方式比生成器表达式更有效。
  • 感谢所有回复的人。很多选择,与 Martijn 的回答一致,因为它的选票最多。没有冒犯所有提供其他出色选择的人。这确实比我的尝试快得多。再次感谢克林顿。
【解决方案2】:

是的,使用字典而不是列表。 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 :在join(...) 的情况下,使用列表推导实际上更快。
【解决方案3】:
match = ''.join(char for char in data if char in self.key)

【讨论】:

  • 感谢所有回复的人。很多选择,与 Martijn 的回答一致,因为它的选票最多。没有冒犯所有提供其他出色选择的人。这确实比我的尝试快得多。再次感谢克林顿。
猜你喜欢
  • 1970-01-01
  • 2014-09-02
  • 2019-04-12
  • 2021-12-16
  • 2019-10-11
  • 2013-04-18
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多