缩小DataFrame会使其更快吗?

时间:2019-06-09 08:04:09

标签: python pandas dataframe

我读了一篇文章(https://www.ritchieng.com/pandas-making-dataframe-smaller-faster/),其中提到它通过减小数据帧(通过转换数据类型)使DataFrame更快。

较小的(内存使用情况)和较快的(cpu时间)之间有关联吗?

假设我有一个 int64 的DataFrame列。如果将其转换为 int8 ,列上的操作会更快吗?例如假设操作为d[col] = d[col] + 1

2 个答案:

答案 0 :(得分:2)

将数据类型从int64更改为int8可以减少存储数据所需的位数。这将大大减少您的内存使用量,当您有大量数据用于密集计算时,这将非常有帮助。这样会在遇到内存错误之前增加熊猫可能获得的数据量。

将对象类型的列更改为特定类型也将提高性能,因为这允许类型优化。

答案 1 :(得分:1)

为什么不测试呢?

int64 dtype

In [29]: df = pd.DataFrame(np.random.randint(100, size=(10**7, 10), dtype="int64"))

In [30]: df.dtypes
Out[30]:
0    int64
1    int64
2    int64
3    int64
4    int64
5    int64
6    int64
7    int64
8    int64
9    int64
dtype: object

内存使用情况(在MiB中):

In [31]: df.memory_usage().sum() / 1024**2
Out[31]: 762.9395294189453

时间:

In [32]: %timeit df.agg(["min","max","mean"])
4.68 s ± 84.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [33]: %timeit df+1
818 ms ± 26 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

int8 dtype

In [34]: df2 = df.astype("int8")

In [35]: df2.dtypes
Out[35]:
0    int8
1    int8
2    int8
3    int8
4    int8
5    int8
6    int8
7    int8
8    int8
9    int8
dtype: object

内存使用情况(在MiB中):

In [38]: df2.memory_usage().sum() / 1024**2
Out[38]: 95.36750793457031

时间:

In [36]: %timeit df2.agg(["min","max","mean"])
2.4 s ± 222 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [37]: %timeit df2+1
170 ms ± 10.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)