- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在对 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
最佳答案
对于一个完全同质的 dtyped numpy 数组,创建时的性能差异非常小并且没有进行复制,并且数组只是通过。
然而,对于异类 dtyped numpy 数组,数据按 dtype(可能涉及复制,尤其是如果您的输入具有不连续的 dtype)分离到单独的 block 中,每个 block 包含一个 dtype(作为 numpy 数组)。
其他类型的数据会触发不同数量的检查(例如,会仔细检查列表是否是一维、二维等),并且会发生与 datetime-likes 强制相关的各种检查。
这种预先 dtype 分离的原因很简单。然后,您可以执行对不同数据类型进行不同操作的操作,而无需运行时分离(以及相应的切片性能问题)。
老实说,为了获得使用 DataFrame 的所有附带优势,这是一个非常非常轻微的性能损失,即一个一致的直观 API,可以智能地正确处理空数据和不同的数据类型。
同类案例,这不涉及复制
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
关于python - 为什么 pandas DataFrame 比 numpy ndarray 贵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26551141/
我正在对 pandas DataFrame 创建进行基准测试,发现它比创建 numpy ndarray 更昂贵。 基准代码 from timeit import Timer setup = """ i
我是一名优秀的程序员,十分优秀!