私はこれについて言及しています: http://docs.python.org/tutorial/datastructures.html
ビッグO表記の観点から、list.index(x)
関数の実行時間はどれくらいですか?
それはO(n)です。以下もチェックしてください: http://wiki.python.org/moin/TimeComplexity
このページでは、現在のCPythonでのさまざまな操作の時間の複雑さ(別名「Big O」または「Big Oh」)について説明します。その他のPython実装(またはCPythonの古いバージョンまたはまだ開発中のバージョン)は、パフォーマンス特性が若干異なる場合があります。ただし、一般に、 O(log n)...
上記のドキュメントによると:
list.index(x)
値がxである最初の項目のリスト内のインデックスを返します。無い場合はエラーとなります。
これは検索を意味します。効果的にやっているx in s
ですが、True
またはFalse
を返すのではなく、x
のインデックスを返します。そのため、O(n)の リストされている時間の複雑さ を使用します。
すべてのリスト実装は、線形検索(たとえば、list.index)のO(n)複雑さ)を持ちます。たぶん、もっと悪いいくつかの奇抜な実装があるかもしれませんが...
順序付きリストやセットなどのさまざまなデータ構造を使用することで、検索の複雑さを改善できます。これらは通常、バイナリツリーで実装されます。ただし、これらのデータ構造は、含まれる要素に制約を課します。バイナリツリーの場合、要素は順序付け可能である必要がありますが、ルックアップコストはO(log n)まで下がります。
前述のように、標準のランタイムコストについてはこちらをご覧くださいPythonデータ構造: http://wiki.python.org/moin/TimeComplexity
次のコードを使用してタイミングを確認します。その複雑さはO(n)です。
import time
class TimeChecker:
def __init__(self, name):
self.name = name
def __enter__(self):
self.start = self.get_time_in_sec()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
now = self.get_time_in_sec()
time_taken = now - self.start # in seconds
print("Time Taken by " + self.name + ": " + str(time_taken))
def get_time_in_sec(self):
return int(round(time.time() * 1000))
def test_list_index_func(range_num):
lis = [1,2,3,4,5]
with TimeChecker('Process 1') as tim:
for i in range(range_num):
lis.index(4)
test_list_index_func(1000)
test_list_index_func(10000)
test_list_index_func(100000)
test_list_index_func(1000000)
print("Time: O(n)")