Python 使用多核将整数列表转换为2的补码位表示列表

Python 使用多核将整数列表转换为2的补码位表示列表,python,map,integer,multiprocessing,bit,Python,Map,Integer,Multiprocessing,Bit,我有一个大约5000万元素的列表。每个元素都是一个32位整数值,表示一个光线路传感器的32个像素。为了进一步处理数据,我需要每个整数值的二元互补表示。这应该会给我一个大约5000万*32个元素的列表,15亿个元素,包含1或0 目前,我通过使用单核进行数字运算直接解决了这个问题。不过,这有点费时。一个普通的文件需要大约300秒才能继续 对于整数值到位表示的转换,我使用以下代码源: 它的工作原理与预期一样,只在以下缺陷上工作:由于uint8类型,导致48秒和49秒,而不是0秒和1秒。但我可以这样做

我有一个大约5000万元素的列表。每个元素都是一个32位整数值,表示一个光线路传感器的32个像素。为了进一步处理数据,我需要每个整数值的二元互补表示。这应该会给我一个大约5000万*32个元素的列表,15亿个元素,包含1或0

目前,我通过使用单核进行数字运算直接解决了这个问题。不过,这有点费时。一个普通的文件需要大约300秒才能继续

对于整数值到位表示的转换,我使用以下代码源:

它的工作原理与预期一样,只在以下缺陷上工作:由于uint8类型,导致48秒和49秒,而不是0秒和1秒。但我可以这样做

现在问题来了:如何通过使用多核来加速这一过程。到目前为止,我已经尝试使用python模块的map函数。但是,性能总是比单核映射慢。我使用了以下代码:

from multiprocessing import Pool
with Pool(processes=3) as pool:         # start 3 worker processes (4-core system)    
    mystring = "".join(pool.map(bits, data))
这通常比python的内置单核映射函数慢50%

有什么建议吗

非常感谢

u8s = myrawdata.view(np.uint8) # no copy, just change "shape"
comp = -u8s # or do you want np.invert(u8s) ?
bits = np.unpackbits(comp)
现在您有了一个0和1的数组,类型为uint8


我认为,如果您尝试上述解决方案,您将不再希望使用多线程解决方案,因为在我的机器上,50 MM随机整数的速度应该已经不到4秒了。

好主意,已经摸索了np.unpackbits,但没有使用view命令。不幸的是,view命令给了我8位值的错误顺序。例如,数字100000被转换为序列160、134、1、0。它必须是0、1、134、160才能等于bin100000。令人惊讶的是,由于我的整数是负数,比如-100000位在手动排序值后会带来正确的位序列。我只需要找到一个快速排序或重新排序算法。嗯,numpy.fliplr成功了。而且速度非常快。3800万个元素的4s与220s的4s与我的每个元素的映射我正要建议myrawdata.byteswap.viewnp.uint8替换我的第一行。如果fliplr做了您想做的事情,那么很好,但是endian交换操作可能更清晰?由你决定!请看这里:如果我理解的话,fliplr将反转整个数组,而byteswap将反转每个整数的字节,因此这取决于您是否希望最终答案向前读取。很高兴你把它整理好了!再次感谢!byteswap是更好的解决方案,速度稍快。做得好;
from multiprocessing import Pool
with Pool(processes=3) as pool:         # start 3 worker processes (4-core system)    
    mystring = "".join(pool.map(bits, data))
u8s = myrawdata.view(np.uint8) # no copy, just change "shape"
comp = -u8s # or do you want np.invert(u8s) ?
bits = np.unpackbits(comp)