python - 最优列表理解(过滤现有列表)
问题描述
我在表单中有一个大列表(1e8+ 个条目)[index:boolean]
。我想找到为真值的索引。在这项任务中的表现是最重要的。
目前,从我在 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 秒)。我曾希望这个操作会快得多。
解决方案
在这项任务中的表现是最重要的
然后你应该考虑使用一个 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
几秒钟。
推荐阅读
- node.js - 尝试安装 node@9.11.2 的问题
- python - 将按钮添加到文件列表
- angular - p-table 过滤器标题中的primeng p-calendar,允许使用手动输入日期并清除它
- c# - JetBrains Rider 删除了前导制表符和空格
- vb.net - 在 VB.NET 中,是否可以打破 AutoProperty 的集合?
- angular - 如何在 jasmine-Karma 浏览器中渲染 hightcharts?
- java - 使用 Java 和 Postman 从 AWS Cognito 获取组描述
- java - 如何在 Spring 中通过 http 返回 tar.gz 文件
- php - 计算活动的缓存会话 Laravel。(需要建议)
- r - 在滞后的数据框中创建新列的问题