PYTHON的垃圾回收错误。当增加到数百万条记录时,pandas数据框是如此之慢。 “应用”功能要比原始数据循环慢100倍以上,这是我上一个使用约150万行记录的项目的结果。我想知道python如何处理GB或TB大小的大数据。是否只是通过获得更好的硬件?
答案 0 :(得分:0)
numpy
(因此建立在其上的pandas
)在将其用于其设计用途时非常有用:高级控制低级数组操作,在以便与低级语言一样创建高性能计算代码,但保留了高级语言的原型开发和开发速度。当apply
和循环不支持您想做的事情并且仍然保留在numpy
世界中,并且应该成为时,打破范式的方法>例外,而不是规则。
之所以这样,是因为(如果可能的话)numpy数据不是作为Python对象存储(如您所述,它很慢),而是作为连续的内存块存储(就像在C或Fortran中那样),并且处理该数据的代码也用C或Fortran编写。因此,使用numpy
进行“正确编写”的代码最好通过告诉numpy
来构造numpy
数组(例如np.genfromtxt
或np.zeros
或类似的东西),然后纯粹通过numpy
(例如np.diff
,np.sum
...)来操作它们。
但是,每次您需要跨越本机代码和Python代码之间的边界时,都会遭受对象包装的开销,因为Python无法直接使用numpy
的数据,{{1}也无法使用}有效地使用Python的数据。 numpy
尤其会发生这种情况,它需要循环遍历np.apply
数据,创建Python对象,将其传递给Python函数,然后解开结果以将其返回到numpy
Universe中
这在TensorFlow之类的GPU库上更加明显,该库甚至没有选择在计算过程中滑回Python:您在Python中设置计算图,该图被编译为GPU代码,然后Python坐在返回并等待直到输出张量被填充。
用于GB大小。对于TB大小,通常无论采用哪种形式都无法将其装入内存,因此某种并行性或分块是必要的-无论使用哪种语言。
tl; dr:如果没有循环和/或numpy
就无法编写代码,那么最好不使用apply
。