我注意到使用来自Pandas的迭代行时性能非常差。
这是别人经历过的事情吗?它是特定于迭代行的吗?对于一定大小的数据(我正在处理200万-300万行),是否应该避免使用这个函数?
GitHub上的讨论使我相信它是在数据帧中混合dtype时引起的,然而下面的简单示例显示,即使使用一个dtype(float64)时也会出现这种情况。这在我的计算机上需要36秒:
import pandas as pd
import numpy as np
import time
s1 = np.random.randn(2000000)
s2 = np.random.randn(2000000)
dfa = pd.DataFrame({'s1': s1, 's2': s2})
start = time.time()
i=0
for rowindex, row in dfa.iterrows():
i+=1
end = time.time()
print end - start
为什么像apply这样的矢量化操作要快得多?我想一定会有一些逐行迭代在那里进行。
我不知道在我的例子中如何不使用迭代(我将为以后的问题保留这个)。因此,如果您一直能够避免这种迭代,我将不胜感激。我正在根据不同的数据流中的数据进行计算。谢谢你!
---编辑:下面添加了我要运行的内容的简化版本---
import pandas as pd
import numpy as np
#%% Create the original tables
t1 = {'letter':['a','b'],
'number1':[50,-10]}
t2 = {'letter':['a','a','b','b'],
'number2':[0.2,0.5,0.1,0.4]}
table1 = pd.DataFrame(t1)
table2 = pd.DataFrame(t2)
#%% Create the body of the new table
table3 = pd.DataFrame(np.nan, columns=['letter','number2'], index=[0])
#%% Iterate through filtering relevant data, optimizing, returning info
for row_index, row in table1.iterrows():
t2info = table2[table2.letter == row['letter']].reset_index()
table3.ix[row_index,] = optimize(t2info,row['number1'])
#%% Define optimization
def optimize(t2info, t1info):
calculation = []
for index, r in t2info.iterrows():
calculation.append(r['number2']*t1info)
maxrow = calculation.index(max(calculation))
return t2info.ix[maxrow]
通常,iterrows
应该只在非常非常特定的情况下使用。这是执行各种操作的一般优先顺序:
1) vectorization
2) using a custom cython routine
3) apply
a) reductions that can be performed in cython
b) iteration in python space
4) itertuples
5) iterrows
6) updating an empty frame (e.g. using loc one-row-at-a-time)
使用自定义Cython例程通常过于复杂,所以我们现在跳过它。
1)矢量化永远是第一和最好的选择。然而,有一小部分情况(通常涉及一个复发)不能用明显的方法矢量化。此外,在一个较小的dataframe
上,使用其他方法可能更快。
4)itertuples
不将数据装箱到series
中,它只是以元组的形式返回数据。
5)iterrows
确实将数据装箱到series
中。除非您确实需要这样做,请使用其他方法。
6)一次单行更新空帧。我见过这种方法用得太多了。它是最慢的。它可能是常见的地方(对于某些python结构来说相当快),但是DataFrame
会对索引进行相当多的检查,所以每次更新一行总是很慢。创建新结构和Concat
要好得多。
问题内容: 我注意到使用pandas的迭代器时性能非常差。 这是别人所经历的吗?它特定于迭代吗?对于一定大小的数据(我正在处理2-3百万行),应该避免使用此功能吗? 在GitHub上进行的讨论使我相信,这是在数据帧中混合时引起的,但是下面的简单示例显示,即使使用一个也存在该问题。这在我的机器上需要36秒: 为什么矢量化运算之类的应用这么快?我想象那里也必须进行逐行迭代。 我无法弄清楚在我的情况下如
我需要一个解决方案来提高这种方法的性能。我需要使用LinkedHashMap按顺序插入这些输入,它工作得很好。然而,我不喜欢这个解决方案,因为我有一个列表,每次我都要通过它来检索我想插入到这个地图中的输入。 这是我的密码 我需要一种方法来检索这些对象,而无需重复此列表3次。
我有这样的数据: 我想创建一个新的列,将成本转换为美元。只是提一下,有12种货币。 这是我所写的: 使用这段代码,我得到了一个错误。
问题内容: 使用迭代器可以提供什么(如果有的话)性能优势。似乎是解决许多问题的“正确方法”,但是它会创建更快/更具有内存意识的代码吗?我在用Python专门思考,但不要仅仅局限于此。 问题答案: 实际上在python邮件列表上有一封很好的邮件: Iterators vs Lists 。这有点过时(从2003年开始),但是据我所知,它仍然有效。 总结如下: 对于小型数据集,基于迭代器和列表的方法具有
问题内容: 我在Java2D方面表现有些古怪。我知道sun.java2d.opengl VM参数可以为2D启用3D加速,但是即使使用该参数也有一些奇怪的问题。 这是我运行的测试结果: 在JComponent上绘制具有32x32像素图块的25x18地图, 图像1 = .bmp格式,图像2 = .png格式 没有-Dsun.java2d.opengl = true 使用.BMP图像1的120 FPS使
最近,我们将数据库从11g更新为19c。 在新数据库版本中测试应用程序时,我们遇到了一个特定视图的性能问题,该视图工作得非常好,但在19c中会导致性能问题。 在分析计划时,我们看到执行计划发生了巨大变化,这导致了19c中视图的性能非常差。 令人惊讶的是,其他观点的效果很好。 如果你能对这个问题有所了解,那就太好了。 谢谢你,JD