2024-09-28 19:27:08 发布
网友
C++有一组函数,FFSH()、FFSL()和FFSLL(),返回给定二进制整数中设置的最低有效位。
我想知道Python中是否已经有了一个等价的函数。我没有看到一个被描述为bitarray,但也许还有另一个。我希望通过遍历所有可能的位掩码来避免计算答案,当然这是最后的选择;ffs()只返回一个整数,我想知道Python中的一些可比性。
它位于GNU多精度库的gmpy包装器中。在我的系统上,它比ctypes解决方案快4倍。
>>> import gmpy >>> gmpy.scan1(136) 3 >>> bin(136) '0b10001000'
可以使用ctypes模块从共享库(Windows用户的dll)加载函数。我能够从C标准库加载ffs()函数,该函数包含在Ubuntu 10.10的libc.so.6中:
ffs()
libc.so.6
>>> import ctypes >>> libc = ctypes.cdll.LoadLibrary('libc.so.6') >>> libc.ffs(136) 4
(注意,这使用基于1的索引)。显然,这与当前的跨平台不兼容;您需要根据正在运行的系统(从sys.platform或类似位置检测到)更改要加载的库的文件名。我甚至不能百分之百确定在不同的Linux发行版上会是相同的。
sys.platform
它也值得做一些适当的基准测试,看看它是否真的值得。如果经常调用它,但如果只是偶尔使用,那么与维护相比,Python实现的性能优势可能微不足道,以确保它在不同的平台上继续工作。
另一种选择是用C编写自己的函数实现,并给出一个Python包装器。然后你必须为你想要的每一个平台编译它,但是在保持速度优势的同时,你就省去了寻找正确库名的麻烦。
仅在Python2.7和3.1及以上:
def ffs(x): """Returns the index, counting from 0, of the least significant set bit in `x`. """ return (x&-x).bit_length()-1
示例:
>>> ffs(136) 3
它位于GNU多精度库的gmpy包装器中。在我的系统上,它比ctypes解决方案快4倍。
可以使用ctypes模块从共享库(Windows用户的dll)加载函数。我能够从C标准库加载
ffs()
函数,该函数包含在Ubuntu 10.10的libc.so.6
中:(注意,这使用基于1的索引)。显然,这与当前的跨平台不兼容;您需要根据正在运行的系统(从
sys.platform
或类似位置检测到)更改要加载的库的文件名。我甚至不能百分之百确定在不同的Linux发行版上会是相同的。它也值得做一些适当的基准测试,看看它是否真的值得。如果经常调用它,但如果只是偶尔使用,那么与维护相比,Python实现的性能优势可能微不足道,以确保它在不同的平台上继续工作。
另一种选择是用C编写自己的函数实现,并给出一个Python包装器。然后你必须为你想要的每一个平台编译它,但是在保持速度优势的同时,你就省去了寻找正确库名的麻烦。
仅在Python2.7和3.1及以上:
示例:
相关问题 更多 >
编程相关推荐