gpt4 book ai didi

python - abs(v) 比 python 中的 (v + mask) ^ mask 快?

转载 作者:太空宇宙 更新时间:2023-11-04 00:58:05 24 4
gpt4 key购买 nike

根据 this page ,一种计算整数绝对值 (abs) 而不在 中分支的方法如下:

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;

出于好奇,我想将它与 Python 中的 abs() 函数进行比较:

> 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,因为通过sys.getsizeof(v)<v的大小是24/

最佳答案

IPython Notebook 简化了计时。 %%timeit 之后的所有代码都是设置代码。我把赋值给v也拿出来了:

%%timeit v = -13
abs(v)

10000000 loops, best of 3: 94.8 ns per loop


%%timeit v = -13;mask = v >> 23
(v + mask)^mask

1000000 loops, best of 3: 182 ns per loop

看起来 abs 确实快了一倍。

查看字节码有助于了解正在发生的事情:

import dis

对于 abs:

dis.dis("""
v = -13
r = abs(v)""")

2 0 LOAD_CONST 2 (-13)
3 STORE_NAME 0 (v)

3 6 LOAD_NAME 1 (abs)
9 LOAD_NAME 0 (v)
12 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
15 STORE_NAME 2 (r)
18 LOAD_CONST 1 (None)
21 RETURN_VALUE

对于另一种方法:

dis.dis("""
v = -13
mask = v >> 23
r = (v + mask)^mask
""")

2 0 LOAD_CONST 3 (-13)
3 STORE_NAME 0 (v)

3 6 LOAD_NAME 0 (v)
9 LOAD_CONST 1 (23)
12 BINARY_RSHIFT
13 STORE_NAME 1 (mask)

4 16 LOAD_NAME 0 (v)
19 LOAD_NAME 1 (mask)
22 BINARY_ADD
23 LOAD_NAME 1 (mask)
26 BINARY_XOR
27 STORE_NAME 2 (r)
30 LOAD_CONST 2 (None)
33 RETURN_VALUE

关于python - abs(v) 比 python 中的 (v + mask) ^ mask 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34130143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com