Numpy和Pandas的计算有区别吗?

时间:2014-02-05 03:04:55

标签: python numpy pandas

我假设我要使用Numpy数组,我写了一堆代码。原来我通过Pandas加载的数据。我现在记得我把它加载到Pandas中因为我在Numpy中加载它时遇到了一些问题。我相信数据太大了。

因此我想知道,使用Numpy和Pandas时计算能力有差异吗?

如果Pandas效率更高,那么我宁愿重写我所有的Pandas代码,但如果没有效率那么我只会使用一个numpy数组......

3 个答案:

答案 0 :(得分:15)

可能存在显着的性能差异,乘法的数量级和索引几个随机值的多个数量级。

我实际上想知道同样的事情并且遇到了这个有趣的比较: http://penandpants.com/2014/09/05/performance-of-pandas-series-vs-numpy-arrays/

答案 1 :(得分:3)

我认为更多的是根据你看到的表现,使用两个战略性的和转移数据(从numpy到pandas或反之亦然)。作为最近的一个例子,我试图使用numpy连接4个小的pickle文件,每个文件有10k行data.shape -> (10,000, 4)

代码类似于:

n_concat = np.empty((0,4))
for file_path in glob.glob('data/0*', recursive=False):
    n_data = joblib.load(file_path)
    n_concat = np.vstack((co_np, filtered_snp))
joblib.dump(co_np, 'data/save_file.pkl', compress = True)

这使我的笔记本电脑(8 GB,i5)崩溃了,这是令人惊讶的,因为音量不是 那么大。 4个压缩的酸洗文件大约每个约5 MB。

同样的事情,在熊猫上工作得很好。

for file_path in glob.glob('data/0*', recursive=False):
    n_data = joblib.load(sd)
    try:
        df = pd.concat([df, pd.DataFrame(n_data, columns = [...])])
    except NameError:
        df = pd.concat([pd.DataFrame(n_data,columns = [...])])
joblib.dump(df, 'data/save_file.pkl', compress = True)

另一方面,当我通过迭代pandas数据帧实现梯度下降时,它非常慢,而使用numpy工作要快得多。

一般来说,我已经看到,大熊猫通常更适合移动/调整中等大块的数据并进行常见的列操作,而numpy最适合于矢量化和递归工作(可能更多的数学密集工作)而不是较小的一组数据

在两者之间移动数据是无忧无虑的,所以我想,从战略角度来看,两者都是可行的。

答案 2 :(得分:1)

在我对大数值数据的实验中,熊猫比Numpy始终慢20倍。鉴于仅执行了简单的算术运算,所以这是一个巨大的差异:列的切片,mean(),searchsorted()-参见下文。最初,我认为Pandas是基于numpy的,或者至少它的实现像numpy一样是C优化的。考虑到巨大的性能差距,这些假设最终被证明是错误的。

在下面的示例中,data是一个熊猫框架,具有8M行和3列(int32,float32,float32),没有NaN值,列#0(时间)被排序。 data_np被创建为data.values.astype('float32')。在Python 3.8,Ubuntu上的结果:

A。列切片和mean():

# Pandas 
%%timeit 
x = data.x 
for k in range(100): x[100000:100001+k*100].mean() 

15.8 ms ± 101 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# Numpy
%%timeit 
for k in range(100): data_np[100000:100001+k*100,1].mean() 

874 µs ± 4.34 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

熊猫比Numpy慢18倍(分别为15.8ms和0.874 ms)。

B。在排序的列中搜索:

# Pandas
%timeit data.time.searchsorted(1492474643)                                                                                                                                                               
20.4 µs ± 920 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

# Numpy
%timeit data_np[0].searchsorted(1492474643)                                                                                                                                                              
1.03 µs ± 3.55 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

熊猫比Numpy慢20倍(20.4µs和1.03µs)。