簡體   English   中英

用於可截斷循環緩沖區的Python快速數據結構

[英]Python fast data structure for truncatable circular buffer

我只是使用log.append(line)來維護當前最近1000000個條目的列表中的日志。 為了確保當大小達到2000000時它不會太長,我復制log = log [1000000:]。 然而,這是相當緩慢的。

在CI中,可以使用鏈接列表將指針移動到日志中間的位置。 但是,這不是一個很好的解決方案,因為我無法再快速跳轉到日志中的特定條目。

是否有一個python解決方案,允許我在任何地方截斷日志,添加到日志的末尾,但仍然允許快速訪問log [i]?

您可以使用collections.deque

Deques支持線程安全,內存有效的追加和來自雙端隊列的彈出,在任一方向上具有大致相同的O(1)性能

對於py2.6之前的python版本:

當附加長度檢查時,如果長度大於1000000,則執行popleft刪除最左側的項目,以便列表始終包含最后1000000項目。

如果你的python版本在py2.6 +然后只是利用maxlen參數:

如果未指定maxlen或為None,則deques可能會增長到任意長度。 否則,雙端隊列限制為指定的最大長度。 一旦有界長度雙端隊列已滿,當添加新項目時,從對方端丟棄相應數量的項目。 有界長度deques提供類似於Unix中的尾部過濾器的功能。 它們還可用於跟蹤僅涉及最近活動的事務和其他數據池。

您可以使用標准庫中的deque

http://docs.python.org/2/library/collections.html#collections.deque

它支持固定的最大長度,可以從文檔中自動執行您要查找的內容:

如果未指定maxlen或為None,則deques可能會增長到任意長度。 否則,雙端隊列限制為指定的最大長度。 一旦有界長度雙端隊列已滿,當添加新項目時,從對方端丟棄相應數量的項目。

看看NumPy http://www.numpy.org :其中包括“強大的N維數組對象......除了明顯的科學用途外,NumPy還可以用作高效的多維度通用數據的容器。“

list.pop(0)有什么問題? 即,當你達到一定長度,而不是l og.append(l)你做

log.append(line)
log.pop(0)

當然,這不會截斷到特定大小,而是將列表保持在有限的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM