Python генератор для более быстрой обработки - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть коллекция student, содержащая не менее 15 миллионов документов. Пример структуры документа выглядит следующим образом:

{
    "_id": "ObjectId('5e8baxxxxxe400a')",
    "Email":"xxx1@gmail.com",
    "Favourites": ["Red","Blue","Green","Orange","Black"]
    "marks": [{"physics":23,"maths":20,"chemistry":19}]
},
{
    "_id": "ObjectId('5e8baxxxxxe4002')",
    "Email":"xxx2@gmail.com",
    "Favourites": ["Purple","Pink","Magenta","White","Black"]
    "marks": [{"physics":22,"maths":25,"chemistry":19}]
},
{
    "_id": "ObjectId('5e8baxxxxxe4002')",
    "Email":"xxx3@gmail.com",
    "Favourites": ["Red","Yellow","Grey","White","Black"]
    "marks": [{"physics":12,"maths":14,"chemistry":19}]
},
{
    "_id": "ObjectId('5e8baxxxxxe4002')",
    "Email":"xxx4@gmail.com",
    "Favourites": ["Green", "White","Pink"]
    "marks": [{"physics":25,"maths":25,"chemistry":19}]
},
{
    "_id": "ObjectId('5e8baxxxxxe4002')",
    "Email":"xxx5@gmail.com",
    "Favourites": ["Green", "White","Black"]
    "marks": [{"physics":10,"maths":9,"chemistry":19}]
},
.....
....

Я ищу способ написать Генератор для расчета общего количества баллов для каждого студенческого документа.

Мой код выглядит следующим образом.

def query():
    r = db.student.aggregate([
          {
          "$project": {
              "Email":1,
              "marks":1,
          }
       }
    ])
    for i in r:
        yield i



def find_total_score(doc):
    total = <code to calculate total by adding marks of physics chemistry and maths>
    doc['total'] = total   #write back the total score for sorting



it = iter(query())
while True:
    try:
        item = next(it)
        find_total_score(item)
    except StopIteration:
        break




Здесь, чтобы завершить весь процесс, требуется несколько минут. Я не получаю никаких преимуществ от использования Generator fuction. Что я здесь не так делаю?

...