由于函数中的“%”语法,Jupyter 中的 %timeit 问题?

%timeit issue in Jupyter due to "%" syntax in function?

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

生成数据

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,尽管这会略微 "bias" 计时,因为它也会占用复制它所需的时间:

%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 只是垃圾收集由于引用循环而无法通过正常方式进行垃圾处理的对象。