我已经获得了大约一个列表。 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%。
有什么建议吗?
非常感谢!
答案 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)
现在您有一个0
和1
的数组,类型为uint8
。
我认为如果您尝试上述解决方案,您将不再希望使用多线程解决方案,因为它应该非常快(我的机器上50 MM随机整数不到4秒)。