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

时间:2017-09-04 09:18:57

标签: python jupyter timeit ipython-magic

我想在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

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

这里发生了什么?

1 个答案:

答案 0 :(得分:1)

%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只是垃圾收集由于参考周期而无法通过正常方式进行吞噬的对象。