1

次のタイプのループがあります。

a = range(10)
b = [something]
for i in range(len(a)-1):
    b.append(someFunction(b[-1], a[i], a[i+1]))

ただし、for ループは多くのパフォーマンスを低下させます。私はWindowsジェネレーターを作成して2つの要素を常に提供しようとしましたが、最後に明示的なforループが必要です。これをPythonicな方法でより短く効率的にする方法はありますか?

ありがとう

編集: b の要素を忘れました..申し訳ありません。ただし、以前の問題の解決策は、私が抱えている他の問題にも非常に役立ちます。ありがとう。

4

4 に答える 4

2

一部のループまたはその他は常に存在しますが、オーバーヘッドを削減する可能性のある1つの可能性は次のとおりです。

import itertools

def generate(a, item):
  a1, a2 = itertools.tee(a)
  next(a2)
  for x1, x2 in itertools.izip(a1, a2):
    item = someFunction(item, x1, x2)
    yield item

として使用される:

b.extend(generate(a, b[-1]))
于 2009-09-23T15:14:36.147 に答える
0

次のようなことを試してください:

a = range(10)    
b = [something] 

s = len(b)
b+= [0] * (len(a) - 1)
[ b.__setitem__(i, someFunction(b[i-1], a[i-s], a[i-s+1])) for i in range(s, len(b))]

また:

  • itertools の関数を使用することも役立つはずです (以前の投稿)
  • someFunction を書き直して、リスト内包表記の代わりに map を使用できるかもしれません
于 2009-09-23T16:58:08.510 に答える