首页 > 解决方案 > 构建多个列表的方法的速度(是否理解?)

问题描述

我试图找到最有效的方法来构建两个带有 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相当陌生,想更好地理解这一点。如此小的列表大小,列表推导不会变得有利吗?我还缺少其他东西吗?

我感谢任何见解,谢谢!

标签: python-2.7list-comprehension

解决方案


如果你注意到我们可以计算每条语句的执行次数:

令 L 为列表的长度

  • 方法 1 次运行
    • is_trunc(key)- 跑 L * 2
    • append(key) - 跑 L * 0
  • 方法 2 次运行
    • is_trunc(key)- 跑 L * 1
    • append(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)很贵!你在里面做什么??:)


推荐阅读