リストへの(移動)ポインタをPythonの関数に渡すことは可能ですか?リストではなく関数にリストポインタを渡す
私は、リストのセクションを処理する再帰関数を持っています。リスト自体は変更されず、その中の「開始点」へのポインタだけが変更されます。私が遭遇した問題は、長いリストがメモリオーバーランでコードを殺したことでした。ここで
コードは次のとおりです。上記の例は不自然である
def trim(l):
print("list len= ", len(l))
if len(l)!= 1:
trim(l[1:])
else:
print("done")
、私の実際のコードはリストだけをトリミングとは異なるものを行いますが、それはまた、移動開始ポインタを持っています。 100万個の整数のリストが10G RAMマシン上のメモリから吹き飛んだ。
アイデアを歓迎します。
Pythonがポインタを持っていません。コピーを作成するスライスの代わりにインデックスを渡すことができます。また、オブジェクト指向プリミティブ配列を提供する 'numpy'の使用を検討することもできます。スライスはコピーではなくビューを作成します。また、組み込みの 'array'モジュールもあり、大きさの数値型の空間効率のよいプリミティブ配列を提供します。これらのアレイアプローチの両方は、桁違いの省スペースを提供するはずです。百万の64ビット整数は約8メガバイトです –
['deque'](https://docs.python.org/3.6/library/collections.html#collections.deque)のデータ構造が役立つかもしれません。 (すべての要素の浅いコピーである)スライスを渡す代わりに、 'l.popleft()'を使って両端キューの先頭から要素を削除することができます。これは 'l'がリストであるとき' l.pop(0) 'のコピーコストを発生させません。 – trentcl