簡體   English   中英

在 python 中使用生成器制作惰性流

[英]Using generators to make lazy streams in python

我一直在搞亂 python 中的流,並一直在嘗試生成漢明數(所有素數僅為 2、3 或 5 的數字)。 Dijkstra 描述的這樣做的標准方法是觀察:

  1. 漢明數列從 1 開始。
  2. 序列中的其余值的形式為 2h、3h 和 5h,其中 h 是任何漢明數。
  3. h是通過輸出值1生成的,然后合並2h、3h、5h

我的實現是這樣的:

def hamming():
    yield 1
    yield from merge(scale_stream(hamming(), 2), scale_stream(hamming(), 3))

def merge(s1, s2):
  x1, x2 = next(s1), next(s2)
  while True:
    if x1 < x2:
        yield x1
        x1 = next(s1)
    elif x1 > x2:
        yield x2
        x2 = next(s2)
    else:
        yield x1
        x1, x2 = next(s1), next(s2)

def scale_stream(stream, scalar):
    for e in stream:
        yield e * scalar

def stream_index(stream, n):
    for i, e in enumerate(stream):
        if i+1 == n:
            return e

print(stream_index(hamming(), 300))

這確實正確地產生了 stream 的漢明數,但是無論出於何種原因,它產生的時間越長,花費的時間就越長,即使理論上時間復雜度應該是 O(N)。

我以前玩過其他流,但我對它們的直覺很弱,所以我不知道這里發生了什么。 我認為問題在於我定義的遞歸方式 hamming(); 我不知道每次調用 hamming 都可能產生必須並行運行的新版本進程從而減慢速度是否是一個問題。

老實說,盡管就像我說的那樣,我對運行它時實際發生的情況知之甚少,調試也無濟於事,因此,如果有更多經驗的人可以啟發我,我將不勝感激。

您進入 stream 的距離越遠,您需要合並的重復項就越多。 數字 2**4 * 3 **4 = 1296 將在您的倍數 stream 中出現 70 次(8 選 4),並且您的程序將花費更多時間合並重復項而不是輸出新項。

你 go 越遠,你要處理的重復越多。 沒有理由期望您的程序是線性的。

暫無
暫無

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

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