Python 将集合{1}作为参数传递时%timeit的特殊错误

Python 将集合{1}作为参数传递时%timeit的特殊错误,python,jupyter-notebook,jupyter,Python,Jupyter Notebook,Jupyter,我遇到了timeitmagic函数的奇怪行为 def f(S): for x in S: pass %timeit f({3}) 引发类型错误:“int”对象不可编辑 这是while%timeit f(set([3]) 作品 而且 %timeit f({1,2})有效 为什么会发生这种情况?啊,您遇到了魔法的一个边缘案例,$variable和{variable}是用来插入python变量的。也就是说,{foo}将被str(foo)的值替换。这对于shell执行非常有用,

我遇到了
timeit
magic函数的奇怪行为

def f(S):
    for x in S:
        pass
%timeit f({3})
引发类型错误:“int”对象不可编辑

这是while
%timeit f(set([3])
作品 而且
%timeit f({1,2})
有效


为什么会发生这种情况?

啊,您遇到了魔法的一个边缘案例,
$variable
{variable}
是用来插入python变量的。也就是说,
{foo}
将被
str(foo)
的值替换。这对于shell执行非常有用,例如,
%bash rm{myfile}
。为了让自己相信这一点,使用
-n1-r1
运行timeit(只运行一个循环
-r1
,一次
-n1
),然后打印
S

In [1]: def f(S):
  ...:     print(S)
  ...:
  ...: %timeit -r1 -n1  f({3})
3
92.6 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
哦,我们得到了
3
而不是
{3}
。。。。解决方案,将
{}
加倍:

In [2]: def f(S):
  ...:     print(S)
  ...:
  ...: %timeit -r1 -n1  f({{3}})
{3}
25.9 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
好!!让我们修复您的示例:

In [3]: def f(S):
  ...:     for x in S:
  ...:         pass
  ...: %timeit f({{3}})
234 ns ± 3.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
你可以在上打开一个bug,我敢肯定已经有一个bug打开了,如果有足够的抱怨,我们可能会在某个时候改变行为;或者至少记录下来。它可能是由
{3}
触发的,而不是
{1,2}
,因为
{3}
{foo}
一样是“括号标识符括号”,但
{1,2}
不是

请注意,
{k}
可用于将选项传递给timeit本身,前提是您完全理解此答案:

In [4]: r=1
   ...: n=2
   ...: %timeit -n{n} -r{r} 1+1
292 ns ± 0 ns per loop (mean ± std. dev. of 1 run, 2 loops each)

啊,你碰到了魔法的一个边缘案例,
$variable
{variable}
是用来插入python变量的。也就是说,
{foo}
将被
str(foo)
的值替换。这对于shell执行非常有用,例如,
%bash rm{myfile}
。为了让自己相信这一点,使用
-n1-r1
运行timeit(只运行一个循环
-r1
,一次
-n1
),然后打印
S

In [1]: def f(S):
  ...:     print(S)
  ...:
  ...: %timeit -r1 -n1  f({3})
3
92.6 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
哦,我们得到了
3
而不是
{3}
。。。。解决方案,将
{}
加倍:

In [2]: def f(S):
  ...:     print(S)
  ...:
  ...: %timeit -r1 -n1  f({{3}})
{3}
25.9 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
好!!让我们修复您的示例:

In [3]: def f(S):
  ...:     for x in S:
  ...:         pass
  ...: %timeit f({{3}})
234 ns ± 3.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
你可以在上打开一个bug,我敢肯定已经有一个bug打开了,如果有足够的抱怨,我们可能会在某个时候改变行为;或者至少记录下来。它可能是由
{3}
触发的,而不是
{1,2}
,因为
{3}
{foo}
一样是“括号标识符括号”,但
{1,2}
不是

请注意,
{k}
可用于将选项传递给timeit本身,前提是您完全理解此答案:

In [4]: r=1
   ...: n=2
   ...: %timeit -n{n} -r{r} 1+1
292 ns ± 0 ns per loop (mean ± std. dev. of 1 run, 2 loops each)