我试图通过timeit模块检查python列表中删除操作的性能,但它会抛出一个ValueError。
In [4]: a = [1, 2, 3]
In [5]: timeit a.remove(2)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-5-7b32a87ebb7a> in <module>()
----> 1 get_ipython().magic('timeit a.remove(2)')
/home/amit/anaconda3/lib/python3.4/site-packages/IPython/core/interactiveshell.py in magic(self, arg_s)
2334 magic_name, _, magic_arg_s = arg_s.partition(' ')
2335 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
-> 2336 return self.run_line_magic(magic_name, magic_arg_s)
2337
2338 #-------------------------------------------------------------------------
..
..
..
..
ValueError: list.remove(x): x not in list
答案 0 :(得分:4)
每次在第一次循环后移除2时都需要创建列表:
In [2]: %%timeit
...: a = [1,2,3]
...: a.remove(2)
...:
10000000 loops, best of 3: 159 ns per loop
你可以看到有10000000
个循环所以通过在timeit运行之外创建列表,你删除了2
第一个循环,所以在后续运行中没有2个删除。
您可以为列表创建时间并减去它,以获得刚刚删除所需时间的近似值。
In [3]: timeit a = [1,2,3]
10000000 loops, best of 3: 89.8 ns per loop
你可以运行一次,但你的时间不会接近准确:
In [12]: a = [1,2,3]
In [13]: timeit -n 1 -r 1 a.remove(2)
1 loops, best of 1: 4.05 µs per loop
timeit magic命令的选项位于docs:
选项:
-n<N>
:在循环中执行给定语句<N>
次。如果未给出该值,则选择拟合值。
-r<R>
:重复循环迭代<R>
次并获得最佳结果。默认值:3
-t
:使用time.time来测量时间,这是Unix上的默认值。此功能可测量墙上时间。
-c
:使用time.clock来测量时间,这是Windows上的默认值并测量墙上时间。在Unix上,使用resource.getrusage代替并返回CPU用户时间。
-p<P>
:使用<P>
位数的精度来显示计时结果。默认值:3
-q
:安静,不打印结果。
-o
:返回一个可以存储在变量中的TimeitResult来检查 结果更详细。