【问题标题】:Big O: Reduce complexety order (list comprehension)大 O:降低复杂性顺序(列表理解)
【发布时间】:2021-06-24 13:07:04
【问题描述】:

我正在尝试读出一些人口普查数据。它由 ~53 mo 线组成,我的一个函数似乎以二次方增加了计算时间。我想过滤所有有区域供暖的区域。这个小小的列表理解让计算时间爆炸:

selection_dh = [x in ids_dh for x in ids_all]

ids_dh 是包含区域供热的区域 ID 列表,ids_all 是所有区域 ID 的列表。 ids_dh 大约是 ids_all 长度的十分之一。

知道如何使这段代码更快吗?

谢谢!

census_dh= census_all.loc[census_all.Expression== "District Heating", :]

ids_all = list(census_all.Grid_ID_100m)
ids_dh = list(census_dh.Grid_ID_100m)

selection_dh = [x in ids_dh for x in ids_all]

【问题讨论】:

  • "ds_dh 是区域 ID 的列表" 这就是问题所在。改为set
  • 据我所知,列表成员测试是线性的,将其更改为具有几乎恒定的优化成员测试的集合。
  • 还有,不用先列ids_all,直接在推导式中使用census_all.Grid_ID_100m
  • 谢谢!从 ids_dh 创建 set 使其速度提高了 100 倍!

标签: python big-o list-comprehension census


【解决方案1】:

怎么样

selection_dh = np.isin(ids_all, ids_dh)

【讨论】:

  • 他想加快对列表的理解。无论这两个列表是什么,np.isin 确实与他的列表理解所做的完全一样,而且在大型列表上肯定更快。为什么它不应该提供答案?
猜你喜欢
  • 2020-01-07
  • 2014-03-07
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多