Efficient ways to duplicate array/list in Python

前端 未结 2 1129
有刺的猬
有刺的猬 2021-01-12 05:40

Note: I\'m a Ruby developer trying to find my way in Python.

When I wanted to figure out why some scripts use mylist[:] instead of list(mylist)

2条回答
  •  轻奢々
    轻奢々 (楼主)
    2021-01-12 06:18

    Use the timeit module in python for testing timings.

    from copy import *
    
    a=range(1000)
    
    def cop():
        b=copy(a)
    
    def func1():
        b=list(a)
    
    def slice():
        b=a[:]
    
    def slice_len():
        b=a[0:len(a)]
    
    
    
    if __name__=="__main__":
        import timeit
        print "copy(a)",timeit.timeit("cop()", setup="from __main__ import cop")
        print "list(a)",timeit.timeit("func1()", setup="from __main__ import func1")
        print "a[:]",timeit.timeit("slice()", setup="from __main__ import slice")
        print "a[0:len(a)]",timeit.timeit("slice_len()", setup="from __main__ import slice_len")
    

    Results:

    copy(a) 3.98940896988
    list(a) 2.54542589188
    a[:] 1.96630120277                   #winner
    a[0:len(a)] 10.5431251526
    

    It's surely the extra steps involved in a[0:len(a)] are the reason for it's slowness.

    Here's the byte code comparison of the two:

    In [19]: dis.dis(func1)
      2           0 LOAD_GLOBAL              0 (range)
                  3 LOAD_CONST               1 (100000)
                  6 CALL_FUNCTION            1
                  9 STORE_FAST               0 (a)
    
      3          12 LOAD_FAST                0 (a)
                 15 SLICE+0             
                 16 STORE_FAST               1 (b)
                 19 LOAD_CONST               0 (None)
                 22 RETURN_VALUE        
    
    In [20]: dis.dis(func2)
      2           0 LOAD_GLOBAL              0 (range)
                  3 LOAD_CONST               1 (100000)
                  6 CALL_FUNCTION            1
                  9 STORE_FAST               0 (a)
    
      3          12 LOAD_FAST                0 (a)    #same up to here
                 15 LOAD_CONST               2 (0)    #loads 0
                 18 LOAD_GLOBAL              1 (len) # loads the builtin len(),
                                                     # so it might take some lookup time
                 21 LOAD_FAST                0 (a)
                 24 CALL_FUNCTION            1         
                 27 SLICE+3             
                 28 STORE_FAST               1 (b)
                 31 LOAD_CONST               0 (None)
                 34 RETURN_VALUE        
    

提交回复
热议问题