SQLalchemy在迭代查询数百万次时的性能

时间:2016-03-18 14:59:52

标签: python sql sqlalchemy

我正在使用SQLalchemy在Python中编写疾病模拟,但是在我在模拟中创建的SQLite文件上运行查询时,我遇到了一些性能问题。

代码如下。外部for循环中有更多查询,但我发布的是将其减慢为爬行的速度。有365天,大约76,200只蚊子,每只蚊子每天进行5次接触,每个模拟日大约381,000个查询,整个模拟大约27,813,000个(蚊子只有蚊子)。它以大约2天/小时的速度运行,如果我正确计算,则每秒约212次查询。

您是否看到任何可以解决的问题可以加快速度?我已经尝试过索引选择中使用的字段,但似乎没有改变任何东西。如果您需要查看完整代码it's available here on GitHub。该功能从第399行开始。

非常感谢,提前。

进行蚊子 - 人类的相互作用

for d in range(days_to_run):
    ... much more code before this, but it ran reasonably fast
    vectors = session.query(Vectors).yield_per(1000)  #grab each vector..
    for m in vectors:
        i = 0
        while i < biting_rate:
            pid = random.randint(1, number_humans)  # Pick a human to bite
            contact = session.query(Humans).filter(Humans.id == pid).first()  #Select the randomly-chosen human from SQLite table

            if contact:  # If the random id equals an ID in the table
                if contact.susceptible == 'True' and m.infected == 'True' and random.uniform(0, 1) < beta:  # if the human is susceptible and mosquito is infected, infect the human
                    contact.susceptible = 'False'
                    contact.exposed = 'True'

                elif contact.infected == 'True' and m.susceptible == 'True':  # otherwise, if the mosquito is susceptible and the human is infected, infect the mosquito
                    m.susceptible = 'False'
                    m.infected = 'True'
                    nInfectedVectors += 1
                    nSuscVectors += 1
                i += 1
    session.commit()

0 个答案:

没有答案