我想在Jupyter中%timeit一个函数。

产生资料

df["One"] = range(1,1001)
df["Two"] = range(2000, 3000)
df["Three"] = range(3000, 4000)
df.set_index(["One"], drop = True, inplace = True)


设定功能

def test_iterrows(df):
    for index, row in df.iterrows():
        if (row["Three"] & 1 == 0):
            df.loc[index, "Three"] = "Even"
        else:
            df.loc[index, "Three"] = "Odd"
    print df.head()
    gc.collect()
return None


当我运行test_iterrows(df)时,我得到:

      Two Three
One
1    2000  Even
2    2001   Odd
3    2002  Even
4    2003   Odd
5    2004  Even


精细。该功能起作用。但是,当我执行%timeit test_iterrows(df)时,出现错误:

<ipython-input-29-326f4a0f49ee> in test_iterrows(df)
     13 def test_iterrows(df):
     14     for index, row in df.iterrows():
---> 15         if (row["Three"] & 1 == 0):
     16             df.loc[index, "Three"] = "Even"
     17         else:

TypeError: unsupported operand type(s) for &: 'str' and 'int'


这里发生了什么?我的解释(可能是错误的)是,我显然不能%timeit包含%的函数。

这里发生了什么?

最佳答案

%timeit重复执行该语句,然后函数就地更改df。请注意,当我只调用两次函数时,会遇到相同的异常:

test_iterrows(df)
test_iterrows(df)
# TypeError: unsupported operand type(s) for &: 'str' and 'int'


您可能应该传递copy,尽管这会稍微“偏向”计时,因为它还会计时复制时间:

%timeit test_iterrows(df.copy())  # time the execution with a copy
%timeit df.copy()                 # compared to the time it takes to just copy it


另外,我不太确定gc.collect()调用应该在那里做什么,因为gc.collect只是垃圾回收对象,由于引用周期,这些对象不能以正常方式进行垃圾回收。

关于python - 由于功能中的“%”语法,Jupyter中的%timeit问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46033941/

10-15 12:57