将64位int和float数据转换为32位或可以处理所有数据的最低dtypes是否会提高numpy的计算速度?有没有理由不这样做吗?
我有两个熊猫数据帧,每个熊猫数据帧有约500万行和23列,其中包含str
,int
,datetime
,float
和timedelta
数据类型。这是一个简短的示例行,其中包含各种数据类型(有关重新创建的代码,请参见下文):
group job_number submission_time maxvmem wait_time
0 g1 3912841 2018-09-29 16:03:49 4.040196e+09 1 days 15:49:38
我正在考虑将非数字映射为数字,并创建一个numpy ndarray以加快处理速度。
我的问题是关于进一步减少数据类型的位大小的步骤。我问是因为我很少/也许从未见过在SO或教程中看到的解决方案中采取的这一步骤。这使我想知道是否有原因不这样做,只是让numpy处理要使用的dtype。
MVCE
这是我尝试重新创建上面的示例行的代码。除timedelta
分配外,它似乎可以正常工作。运行此命令时,我得到ValueError: Could not convert object to NumPy timedelta
。如果有人可以告诉我如何进行这项工作,我会进行更新。
sample_row = pd.DataFrame([['g1', 3912841, '2018-09-29 16:03:49', 4.040196e+09, '1 days 15:49:38']], columns=['group','job_number', 'submission_time', 'maxvmem', 'wait_time'])
sample_row = (sample_row.astype(dtype={'group':'str', 'job_number':'int', 'submission_time':'datetime64[ns]', 'maxvmem':'float', 'wait_time':'timedelta64[ns]'}))
答案 0 :(得分:1)
将位深度从64减半到32将使内存使用量减半。
计算密集型代码最常见的performance bottleneck是内存带宽和缓存使用情况。
如果受计算限制,性能可能会大大提高。
但是不使用32位进行计算。相反,可以在执行大量数学运算的代码中将它们提升为64。使用32个浮点数,您可以更快地击中numerical issues。
我强烈建议不要在任何计算中使用16 bit floats。
编辑
您的示例具有可变数据类型,例如字符串。如果您没有纯粹的numpy数值数组,我的答案就会变得无关紧要。