我读了一篇文章(https://www.ritchieng.com/pandas-making-dataframe-smaller-faster/),其中提到它通过减小数据帧(通过转换数据类型)使DataFrame更快。
较小的(内存使用情况)和较快的(cpu时间)之间有关联吗?
假设我有一个 int64 的DataFrame列。如果将其转换为 int8 ,列上的操作会更快吗?例如假设操作为d[col] = d[col] + 1
答案 0 :(得分:2)
将数据类型从int64更改为int8可以减少存储数据所需的位数。这将大大减少您的内存使用量,当您有大量数据用于密集计算时,这将非常有帮助。这样会在遇到内存错误之前增加熊猫可能获得的数据量。
将对象类型的列更改为特定类型也将提高性能,因为这允许类型优化。
答案 1 :(得分:1)
为什么不测试呢?
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)
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)