最近我一直在对我的脚本进行时间分析。关于元组推导式,我在Stack Overflow上找到了几个帖子指出有两种方法:
list comprehension + tuple()
>>> tuple([i for i in xrange(1000000)])
tuple comprehension
>>> tuple(i for i in xrange(1000000))
cProfile
和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
我假设这些分析器之间的差异源于它们进行分析的方式,但是为什么它们会互相矛盾呢?
谢谢。
tuple()
函数调用和生成器表达式。 - Martijn Pieterstimeit
的结果非常接近,真的很难说。 - Martijn Pieterstimeit
,结果非常接近,很难说哪个更快。它们的速度几乎相同。 - Martijn Pieters