【发布时间】:2020-11-08 12:29:25
【问题描述】:
不确定标题是否是正确的术语。
如果您必须比较 2 个字符串 (A,B) 中的字符并计算 B 中的字符与 A 的匹配数:
sum([ch in A for ch in B])
在 %timeit 上比
快sum(ch in A for ch in B)
我知道第一个将创建一个 bool 列表,然后将 1 的值相加。 第二个是发电机。我不清楚它在内部做什么以及为什么速度较慢?
谢谢。
使用 %timeit 结果编辑:
10 个字符
生成器表达式
列表
10000 次循环,最好的 3 次:每个循环 112 µs
10000 次循环,3 次中的最佳:每个循环 94.6 µs
1000 个字符
生成器表达式
列表
100 个循环,3 个循环中的最佳值:每个循环 8.5 毫秒
100 个循环,3 个循环中的最佳值:每个循环 6.9 毫秒
10,000 个字符
生成器表达式
列表
10 个循环,3 个循环中的最佳值:每个循环 87.5 毫秒
10 个循环,3 个循环中的最佳:每个循环 76.1 毫秒
100,000 个字符
生成器表达式
列表
1 次循环,3 次取胜:每个循环 908 毫秒
1 个循环,3 个循环中的最佳值:每个循环 840 毫秒
【问题讨论】:
-
字符串有多长?生成器是数据惰性的,这可能会增加一些开销,短字符串的开销会大于不复制数据所保存的开销。
-
因为python非常非常擅长创建列表。
-
嗯,即使是长度为10000000的字符串,列表版比生成器版快……我也很好奇速度差异。
-
渐近地,它们似乎正在收敛。最终,必须进行两次遍历并构建列表的成本可能会超过更昂贵的生成器遍历。
标签: python python-3.x