【问题标题】:speed of methods for building multiple list (comprehensions or not?)构建多个列表的方法的速度(是否理解?)
【发布时间】:2019-10-26 11:44:42
【问题描述】:

我正在尝试寻找最有效的方法来构建两个带有 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 次)

方法一:0.000411 方法二:0.000280

我预计方法 1 会更快。我认为列表推导非常适合这种情况,因为它避免了实例化空列表。我发现这个似乎支持这个结果的线程: Python list() vs list comprehension building speed

我对 python 还很陌生,想更好地理解这一点。如此小的列表大小,列表推导不会变得有利吗?我还缺少其他东西吗?

感谢您的任何见解,谢谢!

【问题讨论】:

    标签: python-2.7 list-comprehension


    【解决方案1】:

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

    令 L 为列表的长度

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

    从这个post我们可以看出append的平均时间是:

    ~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) 很贵!你在里面做什么?? :)

    【讨论】:

    • 感谢您的回复。迭代两次更慢是有道理的。我没有提到这一点,但我更喜欢让一个列表不存在然后让一个列表为空(以便以后检查代码)。不过,我会优先考虑速度,稍后再添加额外的检查。谢谢。
    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2011-12-24
    相关资源
    最近更新 更多