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
$
используется здесь, потому что это имеет более низкий приоритет, чем нормальное функциональное приложение. Другой способ написать этот код похож так:
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)
Кстати, это - также определение, которое я предпочел бы, потому что это, кажется, мне намного более ясно.
Я хотел бы объяснить, почему, по моему скромному мнению, это не используемый стиль там:
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, которого я должен благодарить.
Причиной $ используется здесь, является самка к подписи типа (.):
(.) :: (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