【问题标题】:Simple iteration on 100 object to create id list is super slow对 100 个对象进行简单迭代以创建 id 列表非常慢
【发布时间】:2022-12-17 07:28:51
【问题描述】:

我正在使用 pymongo 检索 100 个对象的游标。该对象只包含一个键,因为我过滤了它并且 mongodb 查询足够快。

问题是结果是一个看起来像这样的对象光标: {'id': 1588697856264716288}

我的目标是有一个“id”列表,但只对值感兴趣,所以是这样的: [1588697856264716288,1588697856264716289,...]

在下面的代码中,假设 idd 是包含 100 个对象的游标。最终打印mylist需要将近20秒

mylist=[]
for idd in ids:
    mylist.append(idd["id"])
print(mylist)

为什么这么慢,我怎样才能加快速度?我正在使用 Python3.10

我正在尝试更快地从游标创建一个 id 列表。我尝试使用简单的 for 循环和映射,但它总是需要 15-20 秒

编辑:我刚刚意识到查询变慢的原因(尽管返回游标的速度非常快)

查询是这样的:

ids=mycol.find({"timestamp_ms": {"$gt":"1670979659"}}).limit(100)

在我的数据库中 timestamp_ms 是一个字符串......我想这是我的问题。我应该将它转换为日期以使其更快吗?

【问题讨论】:

  • 当您请求id 引用时,iid 对象是否正在调用您的数据库?
  • 如果idd 是游标,那么idd["id"] 真的是数据库查询吗? minimal reproducible example,请。
  • 请edit你的问题添加查询码。 20 秒意味着不是简单的 Python 代码减慢了速度。
  • 迭代 100 个简单的 dict 对象的列表绝对不会花费 20 秒。
  • 你需要向我们展示什么ids是

标签: python python-3.x pymongo


【解决方案1】:

如果我没记错的话,列表理解比 Python 中的 for 循环更快(在某些情况下)。

您可以尝试以下解决方案:

ids = [{'id': 1}, {'id': 2}]

mylist = [id['id'] for id in ids]
print(mylist)

列表理解的官方文档:https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions

【讨论】:

  • 它更快,但不会快 20 倍(或任何 OP 所期望的)。列表理解所做的唯一一件事就是避免多次查找 mylist.append。 f = mylist.append; for idd in ids: f(idd["id"]) 之类的东西将与列表理解相提并论。
  • 列表理解和for 循环之间的差异不会产生所报告的那种极慢的执行速度(如果 OP 尝试使用列表理解并且它似乎可以解决问题,那是因为他们改变了其他东西并且没有意识到它,不是因为列表理解实际上有帮助)。
猜你喜欢
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多