Я читаю исходный код библиотеки Python
numpy
и находит следующие снимки. Кажется, что он выполняет элементарные операции над векторами (numpy.ndarray
). Например, numpy.multiply([1,2,3],[4,5,6])
получите результат [4,10,18]
Как избыточное if-else помогает оптимизировать?
#define BASE_UNARY_LOOP(tin, tout, op) \
UNARY_LOOP { \
const tin in = *(tin *)ip1; \
tout * out = (tout *)op1; \
op; \
}
#define UNARY_LOOP_FAST(tin, tout, op) \
do { \
/* condition allows compiler to optimize the generic macro */ \
if (IS_UNARY_CONT(tin, tout)) { \
if (args[0] == args[1]) { \
BASE_UNARY_LOOP(tin, tout, op) \
} \
else { \
BASE_UNARY_LOOP(tin, tout, op) \
} \
} \
else { \
BASE_UNARY_LOOP(tin, tout, op) \
} \
} \
while (0)
Это выглядит очень странно для меня, особенно комментарий внутри UNARY_LOOP_FAST
. Что здесь происходит, используя if A then X else X
логику для оптимизации?
Кроме того, если что-то необходимо сделать только один раз, то почему 'делать {...}, а (0); '? – sameerkn
@sameerkn do {...} while (0) является общим и имеет цель, см. [Зачем использовать явно бессмысленные инструкции do-while и if-else в макросах C/C++?] (Https://stackoverflow.com/questions/ 154136/почему использование по-видимому, бессмысленно-делать-то время, и, если-иначе-заявления-в-CC-макросов). –
Возможно, это говорит компилятору рассмотреть частный случай, когда массив 'tout' является таким же, как' tin', например 'np.sin (a, out = a)'. – hpaulj