Функциональное приложение: Почему $ используется здесь?

iterrows не использует векторизованные операции. Большинство преимуществ использования pandas исходят от векторизованных и параллельных операций.

Замените for index, row in df_wf.iterrows(): на df_wf.apply(something, axis=1), где something - это функция, которая инкапсулирует необходимую логику из iterrows и использует numpy векторизованные операции.

Также, если ваш df не помещается в памяти так, что вам нужно пакетное чтение, рассмотрите возможность использования dask или spark вместо pandas.

Дополнительное чтение: https://pandas.pydata.org/pandas-docs/stable/enhancingperf.html

8
задан Community 23 May 2017 в 12:19
поделиться

3 ответа

$ используется здесь, потому что это имеет более низкий приоритет, чем нормальное функциональное приложение. Другой способ написать этот код похож так:

instance Monad [] where
   xs >>= f = (concat . map f) xs

Идея здесь состоит в том, чтобы сначала создать функцию (concat . map f) и затем примените его к его аргументу (xs). Как показано это может также быть сделано путем простого помещения круглой скобки вокруг первой части.

Отметьте то исключение $ в исходном определении не возможно, оно приведет к ошибке типа. Это вызвано тем, что оператор композиции функций ( .) имеет более низкий приоритет, чем нормальное функциональное приложение, эффективно поворачивающее выражение в:

instance Monad [] where
  xs >>= f = concat . (map f xs)

Который не имеет смысла, потому что вторым аргументом оператору композиции функций не является функция вообще. Хотя следующее определение действительно имеет смысл:

instance Monad [] where
  xs >>= f = concat (map f xs)

Кстати, это - также определение, которое я предпочел бы, потому что это, кажется, мне намного более ясно.

11
ответ дан 5 December 2019 в 11:28
поделиться

Я хотел бы объяснить, почему, по моему скромному мнению, это не используемый стиль там:

instance Monad [] where
  xs >>= f = concat (map f xs)

concat . map f пример так называемой записи pointfree-стиля; где pointfree означает "без точки приложения". Помните это в математике в выражении y=f(x), мы говорим это f применяется на точку x. В большинстве случаев можно на самом деле сделать заключительный шаг, заменив:

f x = something $ x

с

f = something

как f = concat . map f, и это - на самом деле pointfree стиль. То, которое более ясно, спорно, но стиль pointfree дает другую точку зрения, которая также полезна, поэтому иногда используется даже когда не точно необходимый.

Править: Я заменил бессмысленный pointfree и зафиксировал некоторые примеры после комментария Alasdair, которого я должен благодарить.

3
ответ дан 5 December 2019 в 11:28
поделиться

Причиной $ используется здесь, является самка к подписи типа (.):

(.) :: (b -> c) -> (a -> c) -> a -> c

Здесь мы имеем

map f :: [a] -> [[b]]

и

concat :: [[b]] -> [b]

Таким образом, мы заканчиваем с

concat . map f :: [a] -> [b]

и тип (.) мог быть записан как

(.):: ([[b]]-> [b])-> (-> [[b]])->-> [b]

Если мы должны были использовать concat . map f xs, мы видели бы это

map f xs :: [[b]]

И так не может использоваться с (.). (тип должен был бы быть (.):: (-> b)->-> b

1
ответ дан 5 December 2019 в 11:28
поделиться
Другие вопросы по тегам:

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