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