回答
嗯,你有沒有嘗試過任何快速和骯髒的測試?這是第一遍:
In [1]: import time
In [2]: def reverse_list_time(my_list):
...: start = time.time()
...: reversed = my_list[::-1]
...: stop = time.time()
...: return stop - start
...:
In [3]: reverse_list_time(list(range(1000)))
Out[3]: 1.33514404296875e-05
In [4]: testing_lists = (list(range(n)) for n in range(1000,100000,500))
In [5]: testing_lists
Out[5]: <generator object <genexpr> at 0x7f7786bd97d8>
In [6]: results = list(map(reverse_list_time,testing_lists))
這裏是我的結果
這看起來大致爲O(n)給我。
如果這不能說服你,這裏是 the implementation。它看起來像一個非常簡單的O(n)解決方案給我。這是它的肉:else {
result = PyList_New(slicelength);
if (!result) return NULL;
src = self->ob_item;
dest = ((PyListObject *)result)->ob_item;
for (cur = start, i = 0; i < slicelength;
cur += step, i++) {
it = src[cur];
Py_INCREF(it);
dest[i] = it;
}
return result;
您可以使用Python的dis.dis
模塊拆卸str[::-1]
:
>>> import dis
>>> def reverse_(str_):
... return str_[::-1]
...
>>> dis.dis(reverse_)
6 0 LOAD_FAST 0 (str_)
3 LOAD_CONST 0 (None)
6 LOAD_CONST 0 (None)
9 LOAD_CONST 1 (-1)
12 BUILD_SLICE 3
15 BINARY_SUBSCR
16 RETURN_VALUE
你可以看到每個指令在documentation手段。對於LOAD_FAST
文檔說:
推到本地
co_varnames[var_num]
參考壓入堆棧。
co_varnames
是一種始終與代碼對象一起出現的結構。在這種情況下,它是str_
:
>>> reverse_.__code__.co_varnames
('str_',)
下一條指令,LOAD_CONST
,被這樣描述:
推
co_consts[consti]
壓入堆棧。
推入堆棧的值爲None
(dis
很有幫助,併爲您查找)。接下來的兩條指令是LOAD_CONST
指令,將值None
和-1
推送到堆棧上。
下一條指令,BUILD_SLICE
,被描述爲:
推棧上切片對象。 argc必須是2或3.如果是2,
slice(TOS1, TOS)
被推入;如果是3,則推入slice(TOS2, TOS1, TOS)
。有關更多信息,請參閱slice()
內置函數。
TOS2, TOS1, TOS
表示堆棧None, None, -1
,其從堆棧(對象變得slice(None, None, -1)
)被推到slice()
對象上的數值。
BINARY_SUBSCR
被描述爲:
實現
TOS = TOS1[TOS]
。
這意味着Python的計算str_[sli]
其中sli
是slice()
對象推到堆棧中的前一指令。它的
>>> str_[slice(None, None, -1)]
最後,RETURN_VALUE
相當於:
返回與TOS的函數的調用者。
最後的指令返回上一步的結果,這是反轉的str_
。
摘要
我看到它的速度非常快,而且方式比一些O(N)解決方案的更多更快,也節省內存。
事實上,通過切片來逆轉列表涉及比Python中的一些其他逆轉方法更多的內存開銷。長話短說(沒有長時間的兔子洞),更大的內存開銷會發生,因爲切片操作會返回整個列表。
一種替代方法可能是:使用reversed()
生成迭代器,這通常對於內存和時間更具性能(儘管從此迭代器生成列表非常耗時)。
Python在這種情況下使用什麼算法?
爲了使長話短說:Python中加載變量str
,構建了一個slice(None, None, -1)
對象,實現str[slice(None, None, -1)]
(source code),並返回逆轉str
。
- 1. '1' - >'1',如何將左str轉換爲右str
- 2. Python模擬,期望str實例MagicMock發現
- 3. 02(str) - 1(int)= 01(str)如何獲得像這樣的結果?
- 4. 如何實現在Python
- 5. Python 3,如果str存在替換str
- 6. python中的默認方法實現(__ str __,__ eq __,__ repr __等)
- 7. 我該如何實現我的parseInt(String str)方法?
- 8. **如何在Python中實現?
- 9. Python:如何實現__getattr __()?
- 10. 如何實現在Python
- 11. python json.loads on str
- 12. 如何實現在警予1
- 13. 如何在Ruby中實現1.day.ago
- 14. Python列舉str
- 15. sizeof(str -1)和sizeof(str)-1之間的區別?
- 16. 如何在Python中實現Haskell實例?
- 17. Python如果轉換str/int
- 18. 如何在($ STR)
- 19. 如何將python str轉換爲bytearray
- 20. 如何使用python解析(小數('str'),)
- 21. Python中如何實現多重賦值?
- 22. 如何在python中實現超時?
- 23. Python A *實現
- 24. Python TEA實現
- 25. 在Hibernate中創建動態sql;我如何實現1 = 1
- 26. 如何實現m [1:3,0:2] + = 1等子矩陣的接口?
- 27. 如何實現與Doctrine的非顯式1:1關係?
- 28. 如何在Python中實現「如果」?
- 29. 如何在Python中實現鏈操作?
- 30. Python如何實現代碼到GUI