2016-09-01 83 views
1

我做了一个小测试:为什么在Python中返回一个元组比多个值更快?

In [12]: def test1(): 
    ...:  return 1,2,3 
    ...: 

In [13]: def test2(): 
    ...:  return (1,2,3) 
    ...: 

In [14]: %timeit a,b,c = test1() 

最慢的运行速度比最快的耗时较长66.88倍。这可能意味着正在缓存中间结果。 千万循环,最好的3:每循环

In [15]: %timeit a,b,c = test2() 

92.7 ns的最慢的运行速度比最快的耗时较长74.43倍。这可能意味着正在缓存中间结果。 10000000循环,最好的3:每循环80.1纳秒

返回一个元组比返回多个值快大约15%。为什么这样?

+0

'test1'和'test2'等价于字节码 – vaultah

+0

@vaultah:所以1,2,3也是一个元组? –

+0

@ Jean-FrançoisFabre是的。 –

回答

7

test1test2都产生相同的字节码,所以它们必须以相同的速度执行。您的测量条件不一致(例如,由于额外的后台进程,测试2的CPU负载增加)。

>>> import dis 
>>> def test1(): 
...  return 1,2,3 
... 
>>> def test2(): 
...  return (1,2,3) 
... 
>>> dis.dis(test1) 
    2   0 LOAD_CONST    4 ((1, 2, 3)) 
       3 RETURN_VALUE 
>>> dis.dis(test2) 
    2   0 LOAD_CONST    4 ((1, 2, 3)) 
       3 RETURN_VALUE 
>>> 
+0

您是否重新运行测试来验证? –

+1

@ReutSharabani是的,我的机器上的结果是超级嘈杂。我得到run1,其中test1的执行时间大约是test2的执行时间,在test1比test2长的地方运行,在test2比test1长的地方运行。这是一种预期的情况,你可以在后台运行任何东西,并尝试分析超快速执行的内容。 –

+0

好吧,因为我的跑步也不一致,但没有一个环境来测试那些目前没有加载。 –

相关问题