2016-09-01 19 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

好吧,因爲我的跑步也不一致,但沒有一個環境來測試那些目前沒有加載。 –

相關問題