最佳列表理解(过滤现有列表)

时间:2019-03-29 13:31:04

标签: python list optimization micro-optimization

我有一个[index:boolean]形式的大列表(1e8 +个条目)。我想找到值为True的索引。 在此任务中的表现至关重要。

目前,根据我在Python 3.7.2中的了解,执行此操作的最佳方法是使用列表理解,如下所示:

return [i for i, j in enumerate(numbers) if j]

我还尝试了以下方法(尽管它似乎只是早期Python版本中的首选方法):

return list(filter(lambda a: a, numbers))

第二种方法比第一种方法慢25%。

当前,此操作大约需要(0.8 * x)的时间,而我算法的实际逻辑部分则需要'x'的时间。 (例如,如果逻辑花费10秒,则从列表中提取正值大约需要8秒钟)。我曾希望此操作会更快。

1 个答案:

答案 0 :(得分:0)

  

在这项任务中的表现至关重要。

然后,您应该考虑使用numpy数组:

import numpy as np
from random import choice
from timeit import Timer

bools = True, False
li = [choice(bools) for _ in range(int(1e8))]
arr = np.array(li)  

print(Timer(lambda: np.nonzero(arr)).repeat(1, 1))

输出

[0.4524359999999916]

那是0.4524359999999916秒。