処理速度に関して、Pythonの処理が並んでいるのを発見しました。
https://wiki.python.org/moin/TimeComplexity
多くはO(1)の処理速度ですが、Copyが常にO(n)の処理スピードを要する理由はなぜか、ご存じの方はいらっしゃるでしょうか。Get ItemやSet ItemがO(1)なので、なんとなくCopyもO(1)なのかなという印象なのですが・・。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
ベストアンサー
この表でのCopyはマニュアルに書かれているlist.copy()
の事だと思われます。
list.copy()
は浅いコピーです。全体のコピーですので、listの要素全てを一つ一つ取り出してコピーしていく必要があります。つまり、一つの取り出し(Get Item)と一つの書き込み(Set Item)は要素の数だけ繰り返します。もし、Get ItemとSet Itemで実装したとしても、それぞれがO(1)であっても、そのO(1)の処理が要素数であるn回繰り返されるため、O(n)になります。実際の実装はもっと工夫して高速になっていると思いますが、要素数と処理時間が比例するという意味であるO(n)を越えて処理時間を短くすることはできません。
なお、他の処理は下記のようなコードの対比になっていると思われます。(Iterationだけこれでいいのか自信がありませんが)
Python
1a = [1, 2, 3, 4, 5] 2# Copy 3a_copy = a.copy() 4# Append[1] 5a.append(1) 6# Insert 7a.insert(2, -2) 8# Get Item 9a_item = a[3] 10# Set Item 11a[4] = 5 12# Delete Item 13del a[1] 14# Iteration 15it = iter(a) 16a_it = [x * 2 for x in it] 17# Get Slice 18a_slice = a[2:4] 19# Del Slice 20del a[2:4] 21# Set Slice 22a[2:4] = [-4, -5] 23# Extend 24a.extend([6, 7]) 25# Sort 26a.sort() 27# Multiply 28a_multi = a * 3 29# x in s 30a_in = [x * x for x in a] 31# min(s), max(s) 32a_min = min(a) 33a_max = max(a) 34# Get Length 35a_len = len(a) 36 37print("a", a) 38print("copy", a_copy) 39print("item", a_item) 40print("it", a_it) 41print("slice", a_slice) 42print("multi", a_multi) 43print("in", a_in) 44print("min", a_min) 45print("max", a_max) 46print("len", a_len)
なお、O(n)はO(1)よりも時間がかかるという意味ではありません。処理時間が、O(1)は要素数に関係無く常に一定だが、O(n)は要素数に比例して長くなると言う意味です。処理の内容次第ですが、要素数が十分少ない場合、O(n)の処理がO(1)の処理より速い場合もあり得ます。
投稿2016/11/16 11:20
総合スコア21751
0
Raccyさんのご回答で申し分ないのですが、一点だけ不思議なことに気づいたので補足。
リスト型には基本的なメソッドとして「Copy」というものが存在していないです。少なくともCPythonの実装ではそうです。そもそも基底となるシーケンス型にない。いっぽうで例えば辞書型には、基本メソッドとして「Copy」があります。
ので、いったい何の実行時間をくらべているのかよくわからないのですが、「Slice」はあるので「list[:]」でくらべてると考えるしかないでしょうか。Raccyさんの挙げたlist.copy()は内部的にこれと等価な実装です (ていうか私は今日の今日まで、list.copy()なんて知らなんだ! スライスでやってました)。
なお、資料では計算時間の指標が「コンテナの要素数n」とされていますから、shallow copyのみを考えています。deep copyではありえません。
投稿2016/11/16 12:15
編集2016/11/16 12:32総合スコア4443
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
'https://wiki.python.org/moin/TimeComplexity'について、私も疑問です。
これ'copy'ではなくて'deepcopy'の時間では?
'copy'ならば浅いコピーでリストを作ってリスト要素のコピーだけだからそんなに処理時間を要さないと思うのですが。'deepcopy'であれば元をコピーするので納得しますが。
投稿2016/11/16 10:19
総合スコア3778
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/16 10:43
2016/11/16 13:06 編集
2016/11/16 13:11

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/16 11:27
2016/11/16 12:44
2016/11/16 14:08
2016/11/17 05:54
2016/11/18 13:12
2016/11/18 23:53