使用sqlalchemy函数加速python

2024-04-24 23:32:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用python和sqlalchemy填充数据库表的函数。这个功能现在运行得相当慢,大约需要17分钟。我认为主要的问题是我正在循环使用两大组数据来构建新表。我已经在下面的代码中包含了记录计数。你知道吗

我怎样才能加快速度?我应该尝试将嵌套的for循环转换为一个大的sqlalchemy查询吗?我用pycharm分析了这个函数,但不确定我是否完全理解结果。你知道吗

def populate(self):
    """Core function to populate positions."""

    # get raw annotations with tag Org
    # returns 11,659 records
    organizations = model.session.query(model.Annotation) \
        .filter(model.Annotation.tag == 'Org')\
        .filter(model.Annotation.organization_id.isnot(None)).all()

    # get raw annotations with tags Support or Oppose
    # returns 2,947 records
    annotations = model.session.query(model.Annotation) \
        .filter((model.Annotation.tag == 'Support') | (model.Annotation.tag == 'Oppose')).all()

    for org in organizations:
        for anno in annotations:

            # Org overlaps with Support or Oppose tag
            # start and end columns are integers
            if org.start >= anno.start and org.end <= anno.end:
                position = model.Position()
                # set to de-duplicated organization
                position.organization_id = org.organization_id
                position.disposition = anno.tag
                # look up bill_id from document_bill table
                document = model.session.query(model.document_bill)\
                    .filter_by(document_id=anno.document_id).first()
                position.bill_id = document.bill_id
                position.document_id = anno.document_id
                model.session.add(position)
                logging.info('org: {}, disposition: {}, bill: {}'.format(
                    position.organization_id, position.disposition, position.bill_id)
                )
                continue
        logging.info('committing to database')
        model.session.commit()

Tags: toorgidformodelsessiontagposition
1条回答
网友
1楼 · 发布于 2024-04-24 23:32:29

我的赌注,按概率降序排列:

  • 自动提交已打开,因此您正在等待磁盘。你知道吗
  • 循环“document=model.session.query模型(票据范本)…..“是慢的(使用解释分析)。你知道吗
  • 实际上,大部分时间都花在将日志打印到内部循环中的终端上(您应该配置文件)
  • 你知道吗模型.session.add(位置)很慢(不知道那是怎么回事)
  • (这个应该是第一个)像INSERT INTO SELECT这样的SQL查询能在几十毫秒内完成吗?如果是这样,为什么要在应用程序中进行循环?。。。你知道吗

相关问题 更多 >