Согласно this page, один из способов вычислить целое абсолютное значение (abs
) без ветвления в c выглядит следующим образом:abs (v) быстрее, чем (v + mask)^маска в python?
int v; // we want to find the absolute value of v
unsigned int r; // the result goes here
int const mask = v >> sizeof(int) * CHAR_BIT - 1;
r = (v + mask)^mask;
Из любопытства, я хотел сравнить его с abs()
функции в Python:
> python -m timeit "v = -13" "r = abs(v)"
10000000 loops, best of 3: 0.119 usec per loop
> python -m timeit "v = -13" "mask = v >> 23" "r = (v + mask)^mask"
10000000 loops, best of 3: 0.18 usec per loop
Кажется, что abs()
имеет лучшую производительность, чем побитовые операции. Зачем? Или я что-то пропустил в своем тестовом коде?
Более подробная информация о вышеуказанных тестовых кодах:
mask = v >> 23
, из-за размером v
является 24
через sys.getsizeof(v)
.
Помните есть весь слой абстракции объектов Python между вашим кодом и базовым кодом C (предполагая CPython). Таким образом, микрооптимизации, такие как бит-хакинг, не являются надежным способом повышения производительности. – jonrsharpe
Аналогично 'sys.getsizeof' сообщает вам о размере объекта Python, а не о количестве бит, необходимых для представления целого. – jonrsharpe