python-2.7 - 构建多个列表的方法的速度(是否理解?)
问题描述
我试图找到最有效的方法来构建两个带有 if 条件的单独列表来评估从函数返回的布尔值。
trunc_keys 列表包含不超过 15 个字符串元素。使用 10 个元素运行测试。
常用功能:
def is_trunc(key):
# about 10 lines of string manipulation that ultimately returns boolean
方法一:
trunc_key_list = [key for key in trunc_keys if is_trunc(key)]
bad_key_list = [key for key in trunc_keys if not is_trunc(key)]
方法二:
trunc_key_list = []
bad_key_list = []
[trunc_key_list.append(key) if is_trunc(key) else bad_key_list.append(key) for key in trunc_keys]
start_time = time.time()
我使用和计时结果print("%s" % (time.time() - start_time))
结果(平均 20 次运行)
方法 1:0.000411 方法 2:0.000280
我预计方法 1 会更快。我认为列表推导是这种情况的理想选择,因为它避免了实例化空列表。我发现这个似乎支持这个结果的线程: Python list() vs list comprehension building speed
我对python相当陌生,想更好地理解这一点。如此小的列表大小,列表推导不会变得有利吗?我还缺少其他东西吗?
我感谢任何见解,谢谢!
解决方案
如果你注意到我们可以计算每条语句的执行次数:
令 L 为列表的长度
- 方法 1 次运行
is_trunc(key)
- 跑 L * 2append(key)
- 跑 L * 0
- 方法 2 次运行
is_trunc(key)
- 跑 L * 1append(key)
- 跑 L * 1
从这篇文章我们可以看到追加的平均时间是:
~115 μs or 0.000115 seconds
- 方法1的(单循环)总时间没有追加:
0.000411 / 2 = 0.0002055
- 方法 2 不附加的总时间:
0.000280 - 0.000115 = 0.000165
然后我们可以减去方法一的总时间和方法二的总时间得到:
- 循环时间差:
0.0002055 - 0.000165 = 0.0000405
- 总循环时间差:
0.0000405 * 2 = 0.000081
0.000081基本上可以忽略不计。因此,循环运行的速度几乎完全相同,但在第一种方法中,您对列表进行了两次迭代,因此需要两倍的时间。
带走: is_trunc(key)
很贵!你在里面做什么??:)
推荐阅读
- owl - SWRL - 无法按持续时间减去日期时间
- javascript - 如何在按钮单击时使 skslider 自动滑动真假
- java - Spring mongo - 来自数组amd检查的总和字段大于
- r - ggplot 条形图 - 标记每个 x 值并删除缺失的观察值
- crystal-reports - Crystal Report Shared NumberVar 从子报表到主报表。为什么第一条记录显示0值?
- python - 将 numpy 字符串数组转换为 numpy 矩阵
- python - OpenCV - 拆分和合并阿尔法通道很慢
- java - Java 8 更高版本中 `url.openStream` 行为的变化
- log4cplus - 用 C++ 制作日历
- javascript - 模拟谷歌地图双击