最近我一直在对我的脚本进行一些时间分析。想知道元组理解我在 SO 上发现了几个线程,指出了两种方法:
列表理解 + tuple()
>>> tuple([i for i in xrange(1000000)])
元组理解
>>> tuple(i for i in xrange(1000000))
我对这样一个事实感到困惑,cProlile
并timeit
告诉我第一种方法比第二种方法更快,而命令行time
和kernprof
行分析器则相反。
这是我得到的:
>>> import cProfile
>>> cProfile.run('tuple([i for i in xrange(1000000)])')
1000003 function calls in 0.139 seconds
>>> cProfile.run('tuple(i for i in xrange(1000000))')
1000003 function calls in 0.478 seconds
>>> import timeit
>>> timeit.timeit('tuple([i for i in xrange(1000000)])')
0.08100390434265137
>>> timeit.timeit('tuple(i for i in xrange(1000000))')
0.08400511741638184
使用 test_tuple_list.py:
tuple([i for i in xrange(1000000)])
和 test_tuple_generator.py:
tuple(i for i in xrange(1000000))
我得到:
$time python test_tuple_list.py
real 0m0.398s
user 0m0.171s
sys 0m0.202s
$time python test_tuple_generator.py
real 0m0.333s
user 0m0.109s
sys 0m0.234s
使用 test_tuple_list_kernprof.py
@profile
def test():
tuple([i for i in xrange(1000000)])
test()
和 test_tuple_generator_kernprof.py:
@profile
def test():
tuple(i for i in xrange(1000000))
test()
我得到:
$kernprof.py -lv test_tuple_list_kernprof.py
Total time: 0.861045 s
$kernprof.py -lv test_tuple_generator_kernprof.py
Total time: 0.444025 s
我假设我在这些分析器之间得到的差异来自于它们的分析方式,但是它们为什么会相互矛盾呢?
谢谢