为何Pandas的groupby操作性能优于纯C实现?
问题:为何Pandas的groupby均值计算性能优于手动编写的纯C实现?
我有一个形状为(n,2)的NumPy数组,存储着x,y对,且每个x对应多个y值,需要计算每个唯一x对应的y的平均值。我知道这需要先做groupby再算均值,Pandas可以实现,但考虑到数据规模超过百万条,我以为Pandas速度会慢,于是用C写了个简单程序,通过ctypes调用完成操作。我用-fPIC参数,通过GCC MinGW编译生成了共享对象文件。
我的C代码如下:
int average( int* array , int size_array , int* unique , int size_unique , float* avg ){ if (size_array % 2 != 0){ return 1; } for (int i = 0 ; i < size_unique ; i++){ int curX = unique[i]; int sum = 0; int count = 0; for (int j = 0 ; j < size_array ; j += 2){ if ( array[j] == curX ){ sum += (array[j+1]); count += 1; } } float average = ((float)sum / (float)count); avg[i] = average; } return 0; }
编译命令:gcc -fPIC -shared c_out.so c_in.c
但这个C程序运行还是慢(百万级数据耗时约1.5秒),我试着用Pandas实现,结果惊讶地发现它的速度几乎是我写的C程序的两倍。这让我完全无法理解:Pandas是怎么做到的?它是不是用了哈希表?
我的Pandas代码如下:
ar = np.random.randint(0,2000,size = (40000,2)) df = pd.DataFrame({'x': ar[:,0], 'y': ar[:,1]}) df = df.groupby('y', as_index=False)['x'].mean() x = df[['x']].to_numpy() y = df[['y']].to_numpy()
我算了一下,对于形状为(40000,2)、包含2000个唯一元素的数组,C代码要执行约80,000,000次操作,耗时不到0.2秒,单次操作约2.5纳秒,已经接近我的处理器极限(3.5GHz四核CPU - Intel i7 4720HQ)。为什么Pandas性能还能更优?
我用Python的time库估算运行时间:在代码执行前后记录时间戳t1和t2,时间差就是运行时间。以下是40000条取值范围0到2448的数据的基准测试样本:
Run #1 Pandas: 0.0623 C: 0.2250 Run #2 Pandas: 0.0660 C: 0.1880 Run #3 Pandas: 0.609 C: 0.2261 Run #4 Pandas: 0.0629 C: 0.2488 Run #5 Pandas: 0.0619 C: 0.2159
想请教:为何Pandas的groupby均值计算性能优于手动编写的纯C实现?其底层采用了何种优化手段?
内容的提问来源于stack exchange,提问作者ARK1375
相关产品推荐
相关产品推荐

