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

2024-06-26 18:00:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份大约有5千万元素的清单。每个元素是32位整数值,表示光学线路传感器的32像素。为了进一步处理数据,我需要两个整数的补码二进制表示法。这应该给我一个大约5000万*32个元素(15亿)的列表,其中包含1或0。在

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

为了将整数值转换为位表示,我使用以下代码(源代码:http://michaelwhatcott.com/a-few-bits-of-python/

def bits(number, size_in_bits = 32):
    if number < 0:
        return compliment(bin(abs(number) - 1)[2:]).rjust(size_in_bits, '1')
    else:
        return bin(number)[2:].rjust(size_in_bits, '0')


def compliment(value):
    return ''.join(COMPLEMENT[x] for x in value)

COMPLEMENT = {'1': '0', '0': '1'}

然后通过以下映射导出实际列表:

^{pr2}$

它的工作方式与预期的一样,只在缺陷上产生48s和49s,而不是uint8类型的0s和1s。但我可以用它。在

现在出现了一个问题:如何通过使用多个核心来加速这一过程。到目前为止,我已经尝试过使用python的multiprocessing模块的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%。在

有什么建议吗?在

非常感谢!在


Tags: 代码in元素number核心列表sizereturn
1条回答
网友
1楼 · 发布于 2024-06-26 18:00:39
u8s = myrawdata.view(np.uint8) # no copy, just change "shape"
comp = -u8s # or do you want np.invert(u8s) ?
bits = np.unpackbits(comp)

现在有一个0s和1s的数组,类型为uint8。在

我想如果你尝试以上的解决方案,你将不再希望一个多线程的,因为它应该已经非常快(在我的机器上50毫米随机整数不到4秒)。在

相关问题 更多 >