为什么pandas DataFrame比numpy ndarray更贵?

时间:2014-10-24 15:26:25

标签: python numpy pandas

我正在对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 个答案:

答案 0 :(得分:5)

对于一个完全同质的dtyped numpy数组,创建的性能差异相当微小,没有复制,数组只是通过。

然而,对于heteregenous dtyped numpy数组,数据被dtype隔离(可能涉及复制,尤其是如果你的输入具有非连续的dtypes),分成块,每个块都有一个dtype(作为numpy数组)。

其他类型的数据会触发不同数量的支票(例如,如果列表是1-d,2-d等,则仔细检查列表),并且会发生与日期时间相似的强制检查。

这种前期dtype分离的原因很简单。然后,您可以执行在不同的dtypes上以不同方式运行的操作,而不会出现运行时间分离(以及相应的切片性能问题)。

说实话,这是一个非常轻微的性能,可以获得使用DataFrame的所有优点,即一致的直观API,可以智能地正确处理空数据和不同的dtypes。

Homogeous case,这涉及无复制

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