我有一份大约有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%。在
有什么建议吗?在
非常感谢!在
现在有一个
0
s和1
s的数组,类型为uint8
。在我想如果你尝试以上的解决方案,你将不再希望一个多线程的,因为它应该已经非常快(在我的机器上50毫米随机整数不到4秒)。在
相关问题 更多 >
编程相关推荐