Возникли проблемы с оптимизацией этого кода, интересно, почему он работает так медленно - как я могу оптимизировать этот код?

Вы можете присоединиться к двум коллекциям в Монго, используя поиск, который предлагается в версии 3.2. В вашем случае запрос будет

db.comments.aggregate({
    $lookup:{
        from:"users",
        localField:"uid",
        foreignField:"uid",
        as:"users_comments"
    }
})

, или вы также можете присоединиться к пользователям, тогда будет небольшое изменение, как указано ниже.

db.users.aggregate({
    $lookup:{
        from:"comments",
        localField:"uid",
        foreignField:"uid",
        as:"users_comments"
    }
})

Он будет работать так же, как левое и правое соединение в SQL.

2
задан jon doe 17 March 2019 в 23:34
поделиться

2 ответа

Для достижения минимального ускорения вы можете добавить break после того, как код найден:

 def defineComplicationsFeatures(patient, comp_list):
    for i in range(len(comp_list)):
        for x in comp_list[i].codes:
            if((any(patient.str.startswith(x,na=False)))):
                patient[comp_list[i].name]=1 #change 0 to 1 in the 
                break
    return patient
0
ответ дан norbeq 17 March 2019 в 23:34
поделиться

Две вещи замедляют ваш код:

  1. Использование двух циклов for
  2. Использование .apply с вашей собственной определенной функцией.

Вы можете оптимизировать решение с помощью векторизованных методов pandas и numpys:

  1. np.where
  2. np.stack_columns
  3. pandas.DataFrame.iloc

Решение: (я не использовал ваш класс в этом случае)

# Print the DataFrame we start with provided by OP
print(df)
      DX1      DX2   DX3 DX4  HeartFailure
0   10R46   R*1005  8017   2             0
1   10R46  R*10335  5019   2             0
2  100R91   R*1005  8017   1             0
3   10R91    R*243  8870   1             0
4   10M95   R*4918  8305   3             0
5   10M95   R*9017  8305   3             0
6   10M95   R*9470  8221   3             0
# Create new optimized function
def defineComplicationsFeatures(df):

    col_to_update = 'HeartFailure'

    strings_to_search = ['80', 'R*1']

    for string in strings_to_search:
        mask = np.column_stack([df[col].str.startswith(string, na=False) for col in df.iloc[:, :-1]]).any(axis=1)
        df[col_to_update] = np.where(mask, 1, 0)

    return df

df_new = defineComplicationsFeatures(df)
print(df_new)

      DX1      DX2   DX3 DX4  HeartFailure
0   10R46   R*1005  8017   2             1
1   10R46  R*10335  5019   2             1
2  100R91   R*1005  8017   1             1
3   10R91    R*243  8870   1             0
4   10M95   R*4918  8305   3             0
5   10M95   R*9017  8305   3             0
6   10M95   R*9470  8221   3             0

Примечание Вы можете передавать col_to_update & amp; strings_to_search к аргументам функции, которая делает его немного чище, я выбрал не для простоты прямо сейчас.

0
ответ дан Erfan 17 March 2019 в 23:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: