2016-09-21 35 views
-2

我有這樣的代碼:反轉列表,同時創造

def iterate_through_list_1(arr): 
    lala = None 
    for i in range(len(arr))[::-1]: 
     lala = i 

def iterate_through_list_2(arr): 
    lala = None 
    for i in range(len(arr), 0, -1): 
     lala = i 

從邏輯上講,通過range()以相反的順序應該建立更加高效,比range()創建列表,並與[::-1]之後扭轉這一名單迭代。但cProfile告訴我,iterate_through_list_1功能工作更快。

我用python-3。在這裏你可以看到在兩個相同的陣列上有100000000個元素的分析輸出。

ncalls tottime percall cumtime percall filename:lineno(function) 
    1 5.029 5.029 5.029 5.029 bs.py:24(iterate_throgh_list_2) 
    1 4.842 4.842 4.842 4.842 bs.py:19(iterate_throgh_list_1) 

創建列表時Python片下發生了什麼?

+3

Python 2.x or 3.x?數字是什麼,時間差別是什麼?你是如何測試它的?你運行過多次迭代嗎? –

+0

第二個函數* *更明顯。更喜歡它,除非有*巨大的*優勢 - 並且它對您的應用程序有所不同。 –

+0

@MartinBonner如果這是完美的,那麼'obj逆向(arr)'呢?或者,如果你真的需要指示,「對於idx,obj枚舉(反向(arr))'? –

回答

1

設計良好的測試顯示,第一個函數在Python 2.x中速度最慢(主要是因爲必須創建兩個列表,第一個作爲遞增範圍,第二個作爲第一個被還原)。我還包括使用reversed的演示。

from __future__ import print_function 
import sys 
import timeit 

def iterate_through_list_1(arr): 
    lala = None 
    for i in range(len(arr))[::-1]: 
     lala = i 

def iterate_through_list_2(arr): 
    lala = None 
    for i in range(len(arr), 0, -1): 
     lala = i 

def correct_iterate_reversed(arr): 
    lala = None 
    for obj in reversed(arr): 
     lala = obj 


print(sys.version) 
print('iterate_through_list_1', timeit.timeit('iterate_through_list_1(seq)', 
               setup='from __main__ import iterate_through_list_1\nseq = range(0, 10000)', 
               number=10000)) 
print('iterate_through_list_2', timeit.timeit('iterate_through_list_2(seq)', 
               setup='from __main__ import iterate_through_list_2\nseq = range(0, 10000)', 
               number=10000)) 
print('correct_iterate_reversed', timeit.timeit('correct_iterate_reversed(seq)', 
               setup='from __main__ import correct_iterate_reversed\nseq = range(0, 10000)', 
               number=10000)) 

結果:在3.X

2.7.12 (default, Jun 29 2016, 14:05:02) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] 
iterate_through_list_1 3.87919592857 
iterate_through_list_2 3.38339591026 
correct_iterate_reversed 2.78083491325 

的差異是可忽略的所有的,因爲在每種情況下的對象遍歷懶惰。

3.5.2 (default, Jul 28 2016, 21:28:00) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] 
iterate_through_list_1 2.986786328998278 
iterate_through_list_2 2.9836046030031866 
correct_iterate_reversed 2.9411962590020266