建立多个列表的方法的速度(是否理解?)

时间:2019-06-12 03:00:56

标签: python-2.7 list-comprehension

我正在尝试找到一种最有效的方式来构建带有if条件的两个单独列表,以评估从函数返回的布尔值。

trunc_keys列表包含的字符串元素不超过15个。测试使用10个元素进行。

常用功能:

    fig = sns.barplot(x="original_language", y=train.id.count(), data=train)

方法1:

def is_trunc(key):
      # about 10 lines of string manipulation that ultimately returns boolean

方法2:

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()来计时结果

结果(平均20次运行)

  

方法1 :0.000411   方法2 :0.000280

我希望方法1更快。我认为列表理解是避免此类实例化的理想选择,因为无需实例化空列表。我发现此线程似乎支持此结果: Python list() vs list comprehension building speed

我对python还是相当陌生,并且希望更好地理解这一点。这么小的列表大小,列表理解是否不会变得有利?我还想念其他东西吗?

感谢您的见解,谢谢!

1 个答案:

答案 0 :(得分:1)

如果您注意到我们可以计算每条语句执行的时间:

让L为列表的长度

  • 方法1次运行
    • is_trunc(key)-运行L * 2
    • append(key)-运行L * 0
  • 方法2次运行
    • is_trunc(key)-运行L * 1
    • append(key)-运行L * 1

在此post中,我们可以看到平均追加时间为:

~115 μs or 0.000115 seconds

  • 方法1的(单循环)总时间,不附加:0.000411 / 2 = 0.0002055
  • 方法2的总时间,不附加:0.000280 - 0.000115 = 0.000165

然后我们可以减去方法1的总时间和方法2的总时间,得出:

  • 循环时差:0.0002055 - 0.000165 = 0.0000405
  • 总循环时差:0.0000405 * 2 = 0.000081

0.000081 基本上可以忽略不计。因此,循环的运行速度几乎完全相同,但是在第一种方法中,您对列表进行了两次迭代,因此花费了两倍的时间。

带走is_trunc(key)太贵了!你在那里做什么? :)