我只是好奇! 是否有任何下限,我们不应该使用熊猫?
考虑到效率和可读性,将大熊猫用于大数据是很好的。
但是我们必须使用传统循环(Python 3)而不是pandas吗?
我应该何时考虑使用熊猫或numpy?
答案 0 :(得分:2)
据我所知,大熊猫在引擎盖下使用numpy(矢量操作)相当广泛。 Numpy比python更快,因为它比python低(并且在很多情况下)具有更多的内存友好行为。但这取决于你当然在做什么。对于基于numpy的操作,pandas当然应该具有与numpy相同的性能。
当您需要时间序列或数据框架(如结构)时,请使用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。如果有人喜欢,请随意用熊猫重复实验