解释iPython prun输出中的{isinstance}?

解释iPython prun输出中的{isinstance}?,python,pandas,ipython,Python,Pandas,Ipython,我试图分析几行Pandas代码,当我运行%prun时,我发现大部分时间都被{isinstance}占用了。这种情况似乎经常发生——有人能建议这意味着什么吗?为了获得额外的积分,有人能建议一种避免这种情况的方法吗 这并不意味着特定于应用程序,但如果这很重要,这里有一个精简版的代码: def flagOtherGroup(df): try:mostUsed0 = df[df.subGroupDummy == 0].siteid.iloc[0] except: mostUsed0 =

我试图分析几行Pandas代码,当我运行%prun时,我发现大部分时间都被{isinstance}占用了。这种情况似乎经常发生——有人能建议这意味着什么吗?为了获得额外的积分,有人能建议一种避免这种情况的方法吗

这并不意味着特定于应用程序,但如果这很重要,这里有一个精简版的代码:

def flagOtherGroup(df):

    try:mostUsed0 = df[df.subGroupDummy == 0].siteid.iloc[0]
    except: mostUsed0 = -1

    try: mostUsed1 = df[df.subGroupDummy == 1].siteid.iloc[0]
    except: mostUsed1 = -1

    df['mostUsed'] = 0 

    df.loc[(df.subGroupDummy == 0) & (df.siteid == mostUsed1), 'mostUsed'] = 1
    df.loc[(df.subGroupDummy == 1) & (df.siteid == mostUsed0), 'mostUsed'] = 1

    return df[['mostUsed']]

%prun -l15  temp = test.groupby('userCode').apply(flagOtherGroup)
和修剪的顶部线条:

   Ordered by: internal time
   List reduced from 531 to 15 due to restriction <15>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   834472    1.908    0.000    2.280    0.000 {isinstance}
497048/395400    1.192    0.000    1.572    0.000 {len}
    32722    0.879    0.000    4.479    0.000 series.py:114(__init__)
    34444    0.613    0.000    1.792    0.000 internals.py:3286(__init__)
    25990    0.568    0.000    0.568    0.000 {method 'reduce' of 'numpy.ufunc' objects}
82266/78821    0.549    0.000    0.744    0.000 {numpy.core.multiarray.array}
    42201    0.544    0.000    1.195    0.000 internals.py:62(__init__)
    42201    0.485    0.000    1.812    0.000 internals.py:2015(make_block)
   166244    0.476    0.000    0.615    0.000 {getattr}
     4310    0.455    0.000    1.121    0.000 internals.py:2217(_rebuild_blknos_and_blklocs)
    12054    0.417    0.000    2.134    0.000 internals.py:2355(apply)
     9474    0.385    0.000    1.284    0.000 common.py:727(take_nd)
订购人:内部时间
由于限制,名单从531个减少到15个
ncalls tottime percall cumtime percall文件名:lineno(函数)
834472 1.908 0.000 2.280 0.000{isinstance}
497048/3954001.192 0.000 1.572 0.000{len}
327220.879 0.000 4.479 0.000系列。py:114
34444 0.613 0.000 1.792 0.000堆内构件。py:3286(初始)
25990 0.568 0.000 0.568 0.000{“numpy.ufunc”对象的方法“reduce”}
82266/78821 0.549 0.000 0.744 0.000{numpy.core.multiarray.array}
42201 0.544 0.000 1.195 0.000堆内构件。py:62(初始)
42201 0.485 0.000 1.812 0.000堆内构件。py:2015(制造块)
166244 0.476 0.000 0.615 0.000{getattr}
4310 0.455 0.000 1.121 0.000堆内构件。py:2217(_rebuild_blknos_和_blklocs)
12054 0.417 0.000 2.134 0.000内部构件。py:2355(适用)
9474 0.385 0.000 1.284 0.000普通。py:727(取下)

isinstance
len
getattr
只是内置函数。有大量的电话打到这里;并不是调用本身花费了很多时间,而是函数被使用了834472次


大概是
pandas
代码在使用它。

iInstance实际上在做什么?len和getattr的名称非常简单,但不清楚“isinstance”在做什么,因此很难确定pandas调用它的原因/位置。@nick_eu:它测试对象是给定类型的实例还是该类型的子类的实例。您可以使用它来测试某物是否是整数,例如,使用
isinstance(obj,int)
。啊,谢谢!令人沮丧的熊猫叫它这么多!numpy/pandas的全部要点是键入整列,以最大限度地减少检查每个项目对性能的影响!:/我不熟悉Pandas的代码库,无法解释为什么它以这样或那样的方式被如此频繁地使用,对不起。@nick_eu你不允许Pandas在这里对你的UDF做任何事情。你在应用groupby方面做得太多了。我不太清楚您想要实现什么,但在GROUPBY中使用try-except块、loc和传入数据的变异是非常低效的。过滤器和/或索引的组合将以更高效的方式实现您想要的。请阅读此处的文档:,如果您仍有顾虑,请提供一个自我复制的示例(在新问题中)。