numpy如何通过将64位数据转换为32位或更低的dtype来减少计算时间

时间:2019-02-04 23:56:53

标签: python pandas numpy types

将64位int和float数据转换为32位或可以处理所有数据的最低dtypes是否会提高numpy的计算速度?有没有理由这样做吗?

我有两个熊猫数据帧,每个熊猫数据帧有约500万行和23列,其中包含strintdatetimefloattimedelta数据类型。这是一个简短的示例行,其中包含各种数据类型(有关重新创建的代码,请参见下文):

    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]'}))

1 个答案:

答案 0 :(得分:1)

将位深度从64减半到32将使内存使用量减半。

计算密集型代码最常见的performance bottleneck是内存带宽和缓存使用情况。

如果受计算限制,性能可能会大大提高。

但是不使用32位进行计算。相反,可以在执行大量数学运算的代码中将它们提升为64。使用32个浮点数,您可以更快地击中numerical issues

我强烈建议不要在任何计算中使用16 bit floats

编辑

您的示例具有可变数据类型,例如字符串。如果您没有纯粹的numpy数值数组,我的答案就会变得无关紧要。