2017-10-28 2 views
2

数字のリストを持っています(基本例)[50,100,150,200,250]指定されたインデックスから、指定した量から各数値をインクリメント(またはデクリメント)する必要があります。しかし、私の本当のリストは数字の数百万人が含まれており、この操作は異なるインデックスと異なるの増分/減分で繰り返し行われる[50, 100, 150, 300, 350]特定のポイントからのリストのPythonインクリメント番号

from itertools import islice 

l = [50,100,150,200,250] 
start_increment_index = 3 

l[start_increment_index:] = [e+100 for e in l[start_increment_index:]] 
print (l) 

l = [50,100,150,200,250] 

l[start_increment_index:] = [e+100 for e in islice(l,start_increment_index,len(l))] 
print (l) 

両方の印刷:私は2つの方法でこれを実行することができました。 Pythonのリストを使ってこれを行うより速い方法がありますか?私はこれに対処するために自分自身のC/C++エクステンションを書くことを検討してきました

編集:これは一般的なPythonの役に立つモジュールでしょうか? Cで書かれた関数を持つと、パラメータ(python_list_object, increment_amount, start_index, end_index)を取ることができますか?

+1

Pythonに関する質問をする場合は、無関係な言語タグ(CやC++など)を追加しないでください。 CまたはC++モジュールを書く* * *の場合、(関連する)タグを使用してそれに関する質問をすることができます。 –

+0

Pythonの配列構造を確認してください。数値の効率的な配列 – Vinny

+1

最高のパフォーマンスが必要な場合は、C/C++プログラムを記述する必要があります(アルゴリズムは簡単に書くことができ、多少スレッド最適化可能です)。そうでなければ、あなたの目標がこの1つの仕事を終わらせることであるならば、このスクリプトにとどまり、答えを待つだけです。一般的に言えば、数(数百万または数兆など)がどれだけ大きいか、またこのスクリプト/プログラムを使用すると思われる回数に依存します。 –

答えて

1

これは、具体的にあなたの目標に依存します。私はこの場合にセグメントツリーを使用できると思います。詳細はhttps://en.m.wikipedia.org/wiki/Segment_treeを参照してください。

簡単な説明のためです。この構造体は、レンジ演算(番号付きの加算/減算サブアレイなど)が実行される配列を表します。この構造は、非常に多くの範囲クエリがある場合に最適化されています。

注:あなたが唯一のPythonのリスト構造を使用したい場合は、その後、あなたは疎テーブルを実装することができます(これは、配列内の木の暗黙の保存とセグメントツリーの別の図である)あなたが作成したソリューションで

1

主な問題(メモリ+コピーを割り当てる)2つのリスト。まず、それ自体がリストの理解であり、その内部にはl[start_increment_index:]があります。

あなたのデータソースは、Pythonのリストである場合は、(n)はOのためにあなたの操作を行うことができます。

for i in range(start_increment_index, len(l)): 
    l[i] += increment 

NB:最初incrementを定義します。

関連する問題