大熊猫效率与小数据

时间:2017-08-18 09:48:29

标签: python performance pandas memory

我只是好奇! 是否有任何下限,我们不应该使用熊猫?

考虑到效率和可读性,将大熊猫用于大数据是很好的。

但是我们必须使用传统循环(Python 3)而不是pandas吗?

我应该何时考虑使用熊猫或numpy?

1 个答案:

答案 0 :(得分:2)

据我所知,大熊猫在引擎盖下使用numpy(矢量操作)相当广泛。 Numpy比python更快,因为它比python低(并且在很多情况下)具有更多的内存友好行为。但这取决于你当然在做什么。对于基于numpy的操作,pandas当然应该具有与numpy相同的性能。

  • 对于一般的矢量(例如,列式应用)操作,使用numpy / pandas总是更快。
  • “for”循环在python中,例如。在pandas上,数据帧行很慢。
  • 如果您需要在pandas中应用非向量化的基于密钥的查找。最好使用像字典这样的东西

当您需要时间序列或数据框架(如结构)时,请使用pandas。如果您可以在矩阵/向量(算术)中组织数据,请使用numpy。

修改 对于非常小的python对象,本机python可能更快,因为低级库引入了很小的开销!

Numpy示例:

In [21]: a = np.random.rand(10)

In [22]: a
Out[22]: 
array([ 0.60555782,  0.14585568,  0.94783553,  0.59123449,  0.07151141,
        0.6480999 ,  0.28743679,  0.19951774,  0.08312469,  0.16396394])

In [23]: %timeit a.mean()
5.16 µs ± 24.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

For循环示例:

In [24]: b = a.tolist()

In [25]: b
Out[25]: 
[0.6055578242263301,
 0.14585568245745317,
 0.9478355284829876,
 0.5912344944487721,
 0.07151141037216913,
 0.6480999041895205,
 0.2874367896457555,
 0.19951773879879775,
 0.0831246913880146,
 0.16396394311100215]

In [26]: def mean(x):
    ...:     s = 0
    ...:     for i in x:
    ...:         s += i
    ...:     return s / len(x)
    ...: 

In [27]: mean(b)
Out[27]: 0.37441380071208025

In [28]: a.mean()
Out[28]: 0.37441380071208025

In [29]: %timeit mean(b)
608 ns ± 2.24 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Ooops,python for循环在这里更快。我似乎numpy在每次timit迭代时都会产生很小的开销(可能来自与c的接口)。 所以让我们试试更长的阵列。

In [34]: a = np.random.rand(int(1e6))

In [35]: %timeit a.mean()
599 µs ± 18.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [36]: b = a.tolist()

In [37]: %timeit mean(b)
31.8 ms ± 102 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

好的,所以我的结论是有一些最小的对象大小,使用像numpy和pandas这样的低级别lib。如果有人喜欢,请随意用熊猫重复实验