実際に試して見ました。
検証に使った問題: No.277 根掘り葉掘り - yukicoder
Rubyでキューひとつ 318 ms
Rubyでキュー入れ替え 322 ms
Python3でキューひとつ(list使用) 2369 ms
Python3でキュー入れ替え(list使用) 2331 ms
PyPy3でキュー一つ(list使用) TLE
PyPy3でキュー入れ替え(list使用) TLE
Python3でキューひとつ(deque使用) 987 ms
Python3でキュー入れ替え(deque使用 1004ms
(作り方がRuby脳なのかな…全く同じアルゴリズムの筈だけどPythonだと遅すぎるし、PyPy3だと逆にTLEとか、なぜだ…)
問題によるかもしれませんが、私の実装では誤差程度しか出ませんでした。
以下のようなプログラムを作り、配列のサイズによってpop()がどうなるかを試しました。
Python
1import random
2import time
3
4while True:
5 n, m = [int(i) for i in input().split()]
6 if n <= 0:
7 break
8 list = [random.randrange(n) for _ in range(n)]
9
10 start_time = time.time()
11 for _ in range(m):
12 list.pop(0)
13 end_time = time.time()
14
15 print("%.8f" % (end_time - start_time))
Python3 3.6.0 macOS Siera
|配列サイズ|取出数|試行回数|平均|最小|最大|
|---|---|---|---|---|
|10|10|10|0.00000560|0.00000286|0.00002098|
|100|10|10|0.00000367|0.00000262|0.00000405|
|1000|10|10|0.00000801|0.00000477|0.00001383|
|10000|10|10|0.00004036|0.00003099|0.00005794|
|100000|10|10|0.00100026|0.00080609|0.00132823|
|1000000|10|10|0.01386561|0.01161385|0.01659012|
TimeComplexity - Python Wikiによるとlistの削除はO(n)らしく、pop(0)
もO(n)と思われます。なお、deque版も作りましたが、資料でO(1)とある通りに一定サイズ以上はほぼ同じ速度になります。Ruby 2.4.0のArray#shiftについても同様にO(1)のようで、一定サイズ以上はほぼ同じ速度です。
このことから、一定サイズ以上のlistをキューに使用するとかなり遅くなる場合があり得ます。キューにはdequeを使って回避するのが良いでしょう。
【蛇足】
なぜ、RubyのArray#shiftは速いのか?
RubyのArray#shiftは、配列が一定サイズ以上の場合、メモリ上の配列はそのままで先頭のポインタをずらすという手法を採っています。メモリ的には不利ですが、速度的には有利になります。サイズの大きさで処理を変えることで、同じ書き方でもなるべく高速に動作させるという戦略のようです。
https://github.com/ruby/ruby/blob/ruby_2_4/array.c#L1000