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

时间:2014-10-15 06:21:10

标签: python map integer multiprocessing bit

我已经获得了大约一个列表。 50百万元素。每个元素是32位整数值,表示光学线传感器的32个像素。为了进一步处理数据,我需要每个整数值的二进制补码二进制表示。这应该给我一个约。 50 mio * 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'}

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

import numpy as np    
mystring = "".join(map(bits, myrawdata))
myrawdata = np.fromstring(mystring, dtype = np.uint8, count = -1)

它的工作方式与预期一样,只有因为uint8型而导致48s和49s而不是0s和1s的缺陷。但我可以解决这个问题。

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

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%。

有什么建议吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

u8s = myrawdata.view(np.uint8) # no copy, just change "shape"
comp = -u8s # or do you want np.invert(u8s) ?
bits = np.unpackbits(comp)

现在您有一个01的数组,类型为uint8

我认为如果您尝试上述解决方案,您将不再希望使用多线程解决方案,因为它应该非常快(我的机器上50 MM随机整数不到4秒)。