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

时间:2015-02-11 18:44:51

标签: python pandas ipython

我试图分析几行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)

1 个答案:

答案 0 :(得分:1)

isinstancelengetattr只是内置函数。这里有一个巨大次呼叫isinstance() function;并不是说呼叫本身需要花费很多时间,但功能使用了834472次。

据推测,使用它的是pandas代码。