为什么pandas DataFrame比numpy ndarray更耗费资源?
我在测试创建 pandas DataFrame
的速度时发现,它比创建 numpy ndarray
要慢。
测试代码
from timeit import Timer
setup = """
import numpy as np
import pandas as pd
"""
numpy_code = """
data = np.zeros(shape=(360,),dtype=[('A', 'f4'),('B', 'f4'),('C', 'f4')])
"""
pandas_code ="""
df =pd.DataFrame(np.zeros(shape=(360,),dtype=[('A', 'f4'),('B', 'f4'),('C', 'f4')]))
"""
print "Numpy",min(Timer(numpy_code,setup=setup).repeat(10,10))*10**6,"micro-seconds"
print "Pandas",min(Timer(pandas_code,setup=setup).repeat(10,10))*10**6,"micro-seconds"
输出结果是
Numpy 17.5073728315 micro-seconds
Pandas 1757.9817013 micro-seconds
我想知道为什么创建 pandas DataFrame
的开销比创建 ndarray
大。如果我做错了什么,能不能帮我提高性能呢?
系统信息
pandas version: 0.12.0
numpy version: 1.9.0
Python 2.7.6 (32-bit) running on Windows 7
1 个回答
6
对于完全相同类型的numpy数组,创建时的性能差别非常小,而且不会进行复制,数组只是直接传递。
但是对于不同类型的numpy数组,数据会根据类型分开存放(这可能会涉及到复制,特别是当你的输入包含不连续的类型时),每个部分只保存一种类型的数据(作为一个numpy数组)。
其他类型的数据会触发不同数量的检查(比如,列表会被检查是1维、2维等等),还有一些与日期时间类型相关的检查。
这样提前分开数据类型的原因很简单。这样你就可以对不同类型的数据进行不同的操作,而不需要在运行时再分开处理(这样可以避免性能问题)。
老实说,为了获得使用DataFrame的所有好处,这一点点性能损失是值得的,特别是它提供了一种一致且直观的接口,可以智能地处理空数据和不同的数据类型。
对于相同类型的情况,这根本不需要复制。
In [41]: %timeit np.ones((10000,100))
1000 loops, best of 3: 399 us per loop
In [42]: arr = np.ones((10000,100))
In [43]: %timeit DataFrame(arr)
10000 loops, best of 3: 65.9 us per loop